home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / BBBBS.baud < prev    next >
Text File  |  1995-06-03  |  146KB  |  5,523 lines

  1. /*               $VER: BBBBS.baud 8.5 (3.6.95)
  2.  BBBBS.baud 8.5 ⌐ 1990-95 Richard Lee Stockton 3 Jun 95 2:05PM
  3.     - FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS -
  4.  
  5.      BBBBS.baud. A full-featured BBS in ARexx for Baudbandit
  6. based on 'Answer.baud'. Thanks to Greg Cunningham for BaudBandit!
  7.      See BBBBS.guide and rexx/bbsLOCAL.rexx for install info
  8. */
  9.  
  10. saypath='SYS:Utilities/Say'
  11.  
  12. /* If QuickSortPort not found then try to run setup.rexx */
  13.  
  14. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  15. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  16.  
  17. IF SHOW('P','BBBBS') THEN
  18.   DO
  19.     SAY 'BBBBS is already running!'
  20.     EXIT 0
  21.   END
  22. CALL OPENPORT('BBBBS')
  23.  
  24. RESET:
  25. CALL SETCLIP('BBS_RESET')
  26.  
  27. copyright.=''
  28. copyright.1=STRIP(SOURCELINE(2))
  29. copyright.2='
  30. Gramma Software 21305-60th Ave West, Mountlake Terrace WA 98043-2009'
  31. copyright.3='
  32. ARexx portions of this software copyright 1990-95 Richard Lee Stockton'
  33. copyright.4='- FREELY DISTRIBUTABLE as long as this notice remains -'
  34.  
  35. CALL SETCLIP('BBS_version',copyright.1)
  36. CALL SETCLIP('BBS_localfiles')
  37. CALL SETCLIP('BBS_localusers')
  38. CALL SETCLIP('BBS_interpret')
  39. CALL SETCLIP('BBS_FULLCALL')
  40. CALL SETCLIP('BBS_MESSAGE')
  41. CALL SETCLIP('BBS_BROWSE')
  42. CALL SETCLIP('BBS_MSGS')
  43. CALL SETCLIP('BBS_QUIT')
  44.  
  45. /* try to trap everything */
  46.  
  47. OPTIONS RESULTS
  48. OPTIONS FAILAT 999999
  49. NUMERIC DIGITS 14
  50. SIGNAL ON HALT
  51. SIGNAL ON SYNTAX
  52. SIGNAL ON FAILURE
  53. SIGNAL OFF BREAK_C
  54. SIGNAL OFF BREAK_E
  55.  
  56. PARSE VERSION . . cpu .
  57. cpu=RIGHT(cpu,2)/10
  58. IF cpu<1 THEN cpu=1
  59. Status Vers
  60. BB_VERS=RESULT
  61. bm=50
  62. IF RIGHT(BB_VERS,4)>1.59 THEN bm=25
  63. dcd
  64. IF RC=0 THEN Send 'ATH1\r'
  65.  
  66. bbsprefs.=0  /* start with all prefs OFF */
  67. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  68. alpha.=''
  69. logonflag=1
  70. emailonline=-1
  71. CALL zerovars()
  72.  
  73. name=''
  74. CR='0D'x
  75. LF='0A'x
  76. lineup='1B'x'M'
  77. lm='Loading Module...'lineup||CR
  78. SAY CR
  79. SAY CENTER(copyright.1,75)||CR
  80.  
  81. CALL PRAGMA('W','N')
  82. CALL config()
  83. IF bbsprefs.15~=0 THEN
  84.   CALL send2log('===== BBBBS started' DATE('W') DATE() TIME('C') '=====')
  85.  
  86. IF ~EXISTS(bbspath'Numbers/FirstLogon') THEN
  87.   ADDRESS COMMAND 'C:Date >'bbspath'Numbers/FirstLogon'
  88.  
  89. SAY CENTER(copyright.2,75)||CR
  90.  
  91. /* open printer? */
  92. IF bbsprefs.3 THEN
  93.   DO
  94.     IF ~OPEN(p,'PRT:','W') THEN
  95.       DO
  96.         CALL send2log('failed to open printer.')
  97.         bbsprefs.3=0
  98.       END
  99.   END
  100.  
  101. /* CALL PRAGMA('W','W')   <-- UN-COMMENT THIS LINE TO ENABLE REQUESTERS */
  102. CALL colors(1)
  103. Capture OFF
  104. Timeout 120
  105. SAY CENTER(copyright.3,75)||CR
  106.  
  107. excuses.=''
  108. courtesy=''
  109. courtesyflag=0
  110. SAY CENTER(copyright.4,75)||CR
  111. SAY CR
  112. SAY CR
  113. SAY CENTER('Setting up, please wait...',75)||CR
  114. SAY CR
  115.  
  116. msg.=''
  117. IF readopen(bbspath'Lists/Conferences') THEN
  118.   DO
  119.     DO i=1
  120.       line=READLN(f)
  121.       IF line='END' THEN BREAK
  122.       IF EOF(f) THEN BREAK
  123.       num=WORD(line,1)
  124.       IF DATATYPE(num,'W') THEN msg.num=WORD(line,2)
  125.     END
  126.     CALL CLOSE(f)
  127.   END
  128.  
  129. dirs.=''
  130. IF readopen(bbspath'Lists/Libraries') THEN
  131.   DO
  132.     DO i=1
  133.       line=READLN(f)
  134.       IF line='END' | EOF(f) THEN LEAVE i
  135.       num=WORD(line,1)
  136.       IF DATATYPE(num,'W') THEN dirs.num=STRIP(WORD(line,2))
  137.     END
  138.     CALL CLOSE(f)
  139.   END
  140.  
  141. users=0
  142. CALL sortuserlist()
  143.  
  144. SAY CR
  145. SAY '          The larger the BBS gets, the longer it takes to setup...'CR
  146. CALL loadfiles()
  147. dcd
  148. IF RC~=0 & bbsprefs.15>0 THEN
  149.   DO
  150.     SAY CR
  151.     SAY '      If it seems to take forever, ask the sysop to try' pen3'Resident'def 'mode.'CR
  152.   END
  153. SAY CR
  154. CALL set_grand()
  155. CALL loadalpha(1)
  156.  
  157. dcd
  158. IF RC=0 THEN
  159.   DO
  160.     logonflag=0
  161.     SIGNAL DONE
  162.   END
  163.  
  164. LOGON:
  165. CALL checkdcd()
  166. bps=0
  167. SetMark 'CONNECT'
  168. IF RC=1 THEN
  169.   DO
  170.     GetLine
  171.     connectline=RESULT
  172.     PARSE VAR connectline 'CONNECT'bps
  173.     CALL STRIP(bps)
  174.     DO i=3 WHILE DATATYPE(SUBSTR(bps,i,1),'N')
  175.     END
  176.     bps=LEFT(bps,i-1)
  177.   END
  178. IF bps<300 | bps>38400 THEN
  179.   DO
  180.     SetMark 'CARRIER'
  181.     IF RC=1 THEN
  182.       DO
  183.         GetLine
  184.         connectline=RESULT
  185.         PARSE VAR connectline 'CARRIER'bps
  186.         CALL STRIP(bps)
  187.       END
  188.     ELSE bps='000 '
  189.   END
  190. DO i=3 WHILE DATATYPE(SUBSTR(bps,i,1),'N')
  191. END
  192. bps=LEFT(bps,i-1)
  193. SIGNAL ON BREAK_C
  194. SIGNAL OFF BREAK_E
  195. REMOTE ON
  196. TimeOut 120
  197. IF bps<300 THEN bps=getbaudrate()
  198. IF bps<300 THEN SIGNAL DONE
  199. bps=bps%1
  200. IF logonflag=0 THEN
  201.   DO
  202.     logonflag=1
  203.     DO i=1 TO 7
  204.       SAY '  'CR
  205.     END
  206.     DO i=1 TO 4
  207.       SAY CENTER(copyright.i,75)||CR
  208.     END
  209.     CALL sound('LOGON')
  210.     CALL DELAY(150)
  211.     SAY CR
  212.     SAY CR
  213.     SAY CR
  214.   END
  215. colorflag=1
  216. CALL colors(1)
  217.  
  218. IF alpha.0='' THEN CALL loadalpha(1)
  219.  
  220. CALL TIME('R')
  221.  
  222. /** Identify (title) message */
  223. IF EXISTS(bbspath'BBS_TEXT/HELLO') THEN
  224.   DO
  225.     nonstop=1
  226.     CALL showtext(bbspath'BBS_TEXT/HELLO' 0)
  227.     nonstop=0
  228.   END
  229. SAY CR
  230.  
  231. SAY 'Running on' BB_VERS 'at' bps 'baud. ' TIME('C') DATE('W') DATE()||CR
  232. Stat 'Z'
  233. CALL checkdcd()
  234.  
  235. /* Ask for name */
  236. name=''
  237. courtesy=''
  238. Queue CR
  239. DO count=1 TO 3
  240.   name=getinput(1 0 'Please enter name: ')
  241.   name=cleanstring(1':'name)
  242.   IF name='NEW' THEN LEAVE count
  243.   IF name~='' THEN
  244.     DO
  245.       IF EXISTS(bbspath'Users/'name) THEN LEAVE count
  246.       IF EXISTS(bbspath'Morgue/'name'.lha') THEN
  247.         DO
  248.           SAY CR
  249.           SAY name 'used to be a member of this BBS.'CR
  250.           SAY 'If that is you, and you recall your password, you may resurrect yourself...'CR
  251.           IF getinput(1 1 'Resurrect' name'? (Ny) > ')='Y' THEN
  252.             DO
  253.               dd=WORD(STATEF(bbspath'Morgue/'name'.lha'),5)
  254.               dd=DATE(,dd,'I')
  255.               SAY 'Resurrecting a dead user.  Killed' dd '...'CR
  256.               ADDRESS COMMAND 'CD' bbspath'0A'x||'lha x Morgue/'name'.lha'
  257.               CALL DELETE(bbspath'Morgue/'name'.lha')
  258.               CALL send2log('RESURRECTED:' name 'who was killed' dd)
  259.               sortuserflag=1
  260.               CALL sound('NEW_USER')
  261.               LEAVE count
  262.             END
  263.         END
  264.       IF FIND(exclusion,name)>0 THEN
  265.         DO
  266.           SAY 'Sorry, that is a reserved name.'CR
  267.           name=''
  268.           ITERATE count
  269.         END
  270.       CALL loadcourtesy()
  271.       IF bbsprefs.7>0 | FIND(courtesy,name)>0 THEN
  272.         DO
  273.           SAY CR
  274.           SAY 'Welcome' name'!'CR
  275.           SAY 'You will be automatically validated after you enter your user info.'CR
  276.           SAY CR
  277.           LEAVE count
  278.         END
  279.     END
  280.   IF count<3 THEN
  281.     DO
  282.       IF STRIP(name)~='' THEN SAY name 'not found.  Please try again.'CR
  283.       SAY 'New Users enter NEW to apply for validation.'CR
  284.     END
  285. END
  286. IF count>3 THEN SIGNAL DONE
  287. CALL TIME('R')
  288. logontime=TIME('C')
  289. line=left(name,16,' ') 'logged in  at' time('C') date('W') date() 'at' bps 'baud'
  290. CALL send2log(line)
  291. CALL checkUser()
  292. x=GETCLIP('BBS_FULLCALL')
  293. CALL SETCLIP('BBS_FULLCALL')
  294. IF WORD(x,1)=name & level<sysoplevel THEN
  295.   DO
  296.     mins=TIME('M')-WORD(x,2)
  297.     IF mins<0 THEN mins=mins+1440
  298.     IF mins<bbsprefs.26 THEN
  299.       DO
  300.         SAY CR
  301.         SAY bak2'*** Please wait at least' bbsprefs.26 'minutes between calls ***'def||CR
  302.         SAY CR
  303.         CALL SETCLIP('BBS_FULLCALL',x)
  304.         SIGNAL LOGOUT2
  305.       END
  306.   END
  307. IF UPPER(WORD(data.12,3))~='BIRTHDAY:' THEN
  308.   DO
  309.     SAY CR
  310.     SAY 'Please help us out by entering the following information.'CR
  311.     CALL getbirth()
  312.     SAY '   Thank you!'CR
  313.   END
  314. prevcaller=''
  315. prevcaller=GETCLIP('BBS_lastcaller')
  316. IF prevcaller~='' THEN CALL SETCLIP('BBS_prevcaller',prevcaller)
  317. city=docity(data.3)
  318. CALL SETCLIP('BBS_lastcaller',name city'  'TIME('C') DATE())
  319. CALL SETCLIP('BBS_level',level)
  320. CALL postuser(0)
  321. Timeout maxidle         /* max idle time at prompts */
  322.  
  323. IF RIGHT(WORD(data.12,4),4)=RIGHT(DATE('S'),4) THEN
  324.   DO
  325.     arg=bbspath'BBS_TEXT/BIRTHDAY'
  326.     IF EXISTS(arg) THEN 
  327.       DO
  328.         SAY CR
  329.         CALL showtext(arg 1)
  330.       END
  331.     SAY CR
  332.     SAY '***  Happy Birthday,' pen3||data.1||def', and many more!  ***'CR
  333.   END
  334. SAY CR
  335.  
  336. /* Get current protocol */
  337. Status Trans
  338. protocol=STRIP(RESULT)
  339.  
  340. IF bbsLOGON.baud(name level)=1 THEN SIGNAL OUT
  341. CALL checkdcd()
  342. CALL sortlibraries()
  343. CALL sortconferences()
  344. IF FIND(data.8,'QUICK')>0 THEN
  345.   DO
  346.     logonflag=0
  347.     CALL do_quick(0)
  348.     logonflag=1
  349.   END
  350.  
  351. /*
  352. Opening Display after logon. Seen by all Users ONCE A DAY. It first
  353. looks for a unique yearly data (ie, WELCOME.0704), then daily data
  354. (ie, WELCOME.Fri), and then a simple, everyday 'WELCOME' datafile.
  355. */
  356.  
  357. CALL postfour('Logon Messages')
  358.  
  359. IF DATE('I')>lastondate THEN
  360.   DO
  361.     SAY CR
  362.     arg=bbspath'BBS_TEXT/WELCOME.'RIGHT(DATE('S'),4)
  363.     CALL showtext(arg 1)
  364.     SAY CR
  365.     arg=bbspath'BBS_TEXT/WELCOME.'LEFT(DATE('W'),3)
  366.     CALL showtext(arg 1)
  367.     SAY CR
  368.     arg=bbspath'BBS_TEXT/WELCOME'
  369.     CALL showtext(arg 1)
  370.  
  371. /*
  372. Looks for files in the format BAUD.baudrate, ie "BAUD.2400" will only
  373. be seen by users logging on at 2400 baud.
  374. */
  375.  
  376.     arg=bbspath'BBS_TEXT/BAUD.'bps
  377.     IF EXISTS(arg) THEN
  378.       DO
  379.         SAY CR
  380.         CALL showtext(arg 1)
  381.       END
  382.  
  383. /*
  384. Looks for files in the format  LEVEL.low-high, ie "LEVEL.50-80" will only
  385. be seen by users with a level >= 50 and <= 80.
  386. */
  387.  
  388.     levels.=''
  389.     IF FileList(bbspath'BBS_TEXT/LEVEL.*',levels)>0 THEN
  390.       DO
  391.         DO ui=1 TO levels.0
  392.           p=LASTPOS('.',levels.ui)
  393.           x=SUBSTR(levels.ui,p+1)
  394.           PARSE VAR x lo'-'hi .
  395.           IF ~DATATYPE(lo,'W') | ~DATATYPE(hi,'W') THEN ITERATE ui
  396.           IF lo>level | hi<level THEN ITERATE ui
  397.           DO
  398.             SAY CR
  399.             CALL showtext(levels.ui 1)
  400.           END
  401.         END
  402.       END
  403.  
  404. /*
  405. Looks for format UNTIL.YYYYMMDD ie, "UNTIL.19920514"
  406. Deletes any that are previous to "today"
  407. */
  408.  
  409.     untils.=''
  410.     IF FileList(bbspath'BBS_TEXT/UNTIL.*',untils)>0 THEN
  411.       DO
  412.         CALL QSORT(1,untils.0,untils)
  413.         DO ui=1 TO untils.0
  414.           IF RIGHT(untils.ui,8)<DATE('S') THEN CALL DELETE(untils.ui)
  415.           ELSE
  416.             DO
  417.               SAY CR
  418.               CALL showtext(untils.ui 1)
  419.             END
  420.         END
  421.       END
  422.     DROP levels. untils.
  423.   END
  424.  
  425. IF bbsprefs.1 & ~terseflag THEN
  426.   DO
  427.     IF doGrin()>3 THEN CALL waiting()
  428.     IF EXISTS(bbspath'rexxDoors/Moon.rexx') THEN CALL Moon.rexx()
  429.     IF EXISTS(bbspath'rexxDoors/Time.rexx') THEN CALL Time.rexx()
  430.     IF FIND(UPPER(SHOWLIST('A')),'TODAY')>0 THEN
  431.       DO
  432.         tf=scratch'/TODAY'
  433.         IF EXISTS(tf) THEN
  434.           DO
  435.             finfo=STATEF(tf)
  436.             IF WORD(finfo,5)~=DATE('I') THEN
  437.               ADDRESS COMMAND 'C:Today091 >'tf
  438.           END
  439.         ELSE ADDRESS COMMAND 'C:Today091 >'tf
  440.         CALL showtext(tf 0)
  441.       END
  442.     SAY CR
  443.   END
  444.  
  445. IF SHOWDIR(bbspath'Email/'name)~='' THEN CALL readmail(0)
  446. ELSE SAY 'Your mailbox is empty.'CR
  447. IF ~terseflag THEN
  448.   DO
  449.     IF level>sysoplevel THEN
  450.       DO
  451.         lstmail=WORD(data.17,3)
  452.         IF ~DATATYPE(lstmail,'W') THEN lstmail=0
  453.         IF countcheck('Numbers/LastMail' 0)>lstmail THEN
  454.           IF getinput(1 1 'Check Email? (Ny) > ')='Y' THEN CALL mailreport()
  455.         IF level<99 THEN
  456.           DO
  457.             SAY CR
  458.             CALL showtext(bbspath'Email/'sysop'/NEW_FILES' 1)
  459.           END
  460.         SAY CR
  461.         CALL showtext(bbspath'Lists/NEW_USERS' 1)
  462.         CALL showtext(bbspath'Lists/CBV_USERS' 1)
  463.       END
  464.     CALL logonstats()
  465.     CALL newinfo()
  466.   END
  467. CALL showmarked(1)
  468. CALL setdir(libpath||dirs.1)
  469. logonflag=0
  470.  
  471.  
  472. /***** MAIN *****/
  473.  
  474. IF menu~='ALL' THEN menu='MAIN'
  475.  
  476. RESTART:
  477. IF name='' | data.20='' | logonflag THEN SIGNAL LOGON  /* login was interrupted */
  478. SIGNAL ON BREAK_C
  479. SIGNAL ON BREAK_E
  480.  
  481. waitchar=''
  482. string=''
  483. opt=''
  484. IF level<1 THEN menu='NEW'
  485. DO WHILE(opt~='G')
  486.   go=0
  487.   uldlflag=0
  488.   DO WHILE(~go)
  489.     IF waitchar='' | waitchar='?' THEN
  490.       DO
  491.         commands='ceghiqrsvwxyz!#,'
  492.         IF level>0  THEN commands='abcdefghijlmnoprstuvwxyz!$#&+,.'
  493.         IF level>sysoplevel THEN commands=commands'k%^()=;'
  494.         IF level=99 THEN commands=commands'@~'
  495.         commands=commands'?'
  496.         IF menuflag | waitchar='?' | string='?' THEN CALL menus()
  497.         ELSE SAY pen3'COMMANDS:'def commands||CR
  498.         opt='MENU'
  499.         arg=''
  500.         CALL postuser(1)
  501.         IF level=0 THEN
  502.           IF SHOWDIR(bbspath'Email/'name)~='' THEN
  503.             DO
  504.               SAY 'You have new Email waiting! - Enter E to read your [E]mail'CR
  505.               SAY CR
  506.             END
  507.       END
  508.     CALL showtime()
  509.     line=''
  510.     line=line||bak2' 'TIME('C')' 'def
  511.     IF menu='ALL' | menu='FILE' THEN
  512.       line=line pen3'FILE_LIBRARY:'plaindir||def
  513.     ELSE IF menu='MSG' THEN line=line pen3'MESSAGES:'def
  514.     ELSE line=line pen3'MAIN:'def
  515.     line=line'  'bbsname
  516.     IF waitchar='' THEN waitchar=getinput(0 0 line' > ')
  517.     PARSE VAR waitchar string' 'arg
  518.     CALL checkdcd()
  519.     nonstop=0
  520.     string=UPPER(STRIP(string))
  521.     IF clr~='' THEN Send clr
  522.     IF POS('+++',string)>0 THEN SIGNAL OUT
  523.     IF string='OFF' | string='BYE' THEN SIGNAL LOGOUT2
  524.     IF string='FL' & level>0 THEN
  525.       DO
  526.         CALL bbsFriends.rexx(name colorflag)
  527.         string=''
  528.       END
  529.     CALL checkalias()
  530.     IF LEFT(string,1)='D' THEN
  531.       IF DATATYPE(SUBSTR(string,2),'W') THEN arg=SUBSTR(string,2) arg
  532.     waitchar=''
  533.     warnings=0
  534.     IF DATATYPE(string,'W') THEN
  535.       DO
  536.         IF string>level THEN
  537.           DO
  538.             arg=STRIP(string arg)
  539.             string='D'
  540.           END
  541.         ELSE
  542.           DO
  543.             dirnum=string
  544.             CALL chdir2()
  545.             CALL since()
  546.           END
  547.       END
  548.     IF string='QUICK' & level>0 THEN CALL do_quick(1)
  549.     opt=LEFT(string,1)
  550.     IF opt='G' THEN
  551.       DO
  552.         IF getinput(1 1 pen3'Logoff? (nY) > 'def)='N' THEN opt='?'
  553.       END
  554.     go=1    /* check for access */
  555.     t=bbspath'BBS_TEXT/COM.'opt
  556.     IF UPPER(arg)='EDIT' & level>sysoplevel THEN
  557.       DO
  558.         CALL edinfo(t,opt,'Menu Command')
  559.         opt=''
  560.       END
  561.     IF ~terseflag THEN CALL showtext(t 1)
  562.     IF POS(opt,UPPER(commands))=0 THEN go=0
  563.   END
  564.   IF CBVflag=1 THEN SIGNAL OUT
  565.   CALL postuser(1)
  566.   OPTIONS PROMPT 'Filename: '
  567.   SELECT
  568.     WHEN opt='A' THEN CALL showalpha()
  569.     WHEN opt='B' THEN CALL browse()
  570.     WHEN opt='C' THEN CALL editor(name maxtime-TRUNC(TIME('E')) 'MAIL' sysop . 0 0 'FEEDBACK')
  571.     WHEN opt='D' THEN CALL dload()
  572.     WHEN opt='E' THEN CALL readmail(level>0)
  573.     WHEN opt='F' THEN CALL do_F()
  574.     WHEN opt='H' THEN CALL help('MAIN')
  575.     WHEN opt='I' THEN CALL information()
  576.     WHEN opt='J' THEN CALL jump2rexx()
  577.     WHEN opt='K' THEN CALL killuser()
  578.     WHEN opt='L' THEN CALL list()
  579.     WHEN opt='M' THEN IF menu~='ALL' THEN menu='MSG'
  580.     WHEN opt='N' THEN CALL newfiles()
  581.     WHEN opt='O' THEN CALL otheruser()
  582.     WHEN opt='P' THEN CALL editor(name maxtime-TRUNC(TIME('E')) 'MSG' . . 0 0)
  583.     WHEN opt='R' THEN IF menu='NEW' THEN CALL CBV();ELSE CALL readmessages()
  584.     WHEN opt='S' THEN CALL bbsSEARCH()
  585.     WHEN opt='T' THEN CALL chpro()
  586.     WHEN opt='U' THEN CALL uload(1)
  587.     WHEN opt='V' THEN CALL showtext(bbspath'Usage/USER.LOG' 1)
  588.     WHEN opt='W' THEN CALL showuserlist()
  589.     WHEN opt='X' THEN CALL switchmenuflag()
  590.     WHEN opt='Y' THEN CALL edituser()
  591.     WHEN opt='Z' THEN CALL counts()
  592.     WHEN opt='~' THEN CALL sysED(1)
  593.     WHEN opt='!' THEN CALL yell()
  594.     WHEN opt='@' THEN CALL shell()
  595.     WHEN opt='#' THEN CALL switchcolors()
  596.     WHEN opt='$' THEN IF menu='ALL' THEN menu='MAIN'; ELSE menu='ALL'
  597.     WHEN opt='%' THEN CALL editnote()
  598.     WHEN opt='^' THEN CALL readlogs()
  599.     WHEN opt='&' THEN CALL bbsProfiles.rexx(name level sysoplevel linesperpage colorflag maxtime-TIME('E') bbspath)
  600.     WHEN opt='+' THEN CALL ext_dload()
  601.     WHEN opt='(' THEN CALL filereport()
  602.     WHEN opt=')' THEN CALL mailreport()
  603.     WHEN opt='=' THEN CALL levelreport()
  604.     WHEN opt=';' THEN CALL changename()
  605.     WHEN opt=',' THEN DO;CALL hourly();CALL waiting();END
  606.     WHEN opt='.' THEN IF menu~='ALL' THEN menu='MAIN'
  607.     WHEN opt='?' THEN IF menuflag THEN CALL help('MAIN')
  608.     OTHERWISE NOP
  609.   END
  610. END
  611. SIGNAL LOGOUT
  612. EXIT
  613.  
  614.  
  615.  
  616. /* FUNCTIONS */
  617.  
  618.  
  619. do_F:
  620. IF menu='FILE' | menu='ALL' THEN
  621.   DO
  622.     IF STORAGE()<(bbsprefs.15+100000) | GETCLIP('BBS_libs.0')~='' THEN
  623.       DO
  624.         SAY CR
  625.         SAY 'Sorry! Not enough memory left for background archiving.'CR
  626.         SAY 'Please try again in 10 minutes or so.'CR
  627.         SAY CR
  628.         RETURN
  629.       END
  630.     DO i=0 TO libs.0
  631.       CALL SETCLIP('BBS_libs.'i,libs.i)
  632.     END
  633.     IF Make_BrowseList.baud(name colorflag files.0)=0 THEN
  634.       DO
  635.         CALL send2log('Arc: Make_BrowseList.baud')
  636.         IF emailonline>=0 THEN emailonline=emailonline+1
  637.       END
  638.     DO i=0 TO libs.0
  639.       CALL SETCLIP('BBS_libs.'i)
  640.     END
  641.   END
  642. ELSE IF menu~='ALL' THEN menu='FILE'
  643. RETURN
  644.  
  645.  
  646. cleanstring:
  647. PARSE ARG nflag':'cstr
  648. IF nflag=1 THEN
  649.   DO
  650.     cstr=COMPRESS(cstr,"'`")
  651.     cstr=TRANSLATE(cstr,,namemask)
  652.     cstr=SPACE(cstr,1,'_')
  653.     RETURN cstr
  654.   END
  655. bot=XRANGE(,'1F'x)
  656. IF nflag=2 THEN bot=COMPRESS(bot,'1B'x)  /* ESC for ANSI */
  657. ELSE cstr=strip_ansi(cstr)
  658. top=XRANGE('7F'x)
  659. cstr=COMPRESS(cstr,bot||top)
  660. IF nflag=0 THEN cstr=STRIP(cstr)
  661. RETURN cstr
  662.  
  663.  
  664. showtext:
  665. PARSE ARG starg warg .
  666. IF EXISTS(starg'.'colorflag) THEN
  667.   DO
  668.     IF OPEN(f,starg'.'colorflag,'R')=0 THEN RETURN
  669.     t=READCH(f,65000)
  670.     CALL CLOSE(f)
  671.     SAY t
  672.   END
  673. ELSE IF EXISTS(starg) THEN
  674.   DO
  675.     CALL readlines(starg 1)
  676.     IF colorflag=0 THEN CALL strip_lynes()
  677.     CALL seelines(1)
  678.   END
  679. ELSE RETURN
  680. IF warg THEN
  681.   DO
  682.     CALL waiting()
  683.     nonstop=0
  684.   END
  685. RETURN
  686.  
  687.  
  688. strip_lynes:
  689. DO i=1 TO lynes.0
  690.   lynes.i=strip_ansi(lynes.i)
  691. END
  692. RETURN
  693.  
  694.  
  695. strip_ansi:
  696. PARSE ARG aline 
  697. n=POS('1B'x,aline)
  698. DO WHILE n>0
  699.   DO k=2
  700.     IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
  701.       leave k
  702.   END
  703.   aline=DELSTR(aline,n,k+1)
  704.   n=POS('1B'x,aline)
  705. END
  706. RETURN aline
  707.  
  708.  
  709. doGrin:
  710. IF ~EXISTS(bbspath'rexxDoors/Grin_du_Jour.rexx') THEN RETURN 0
  711. CALL setdir(bbspath'rexxDoors')
  712. temp=Grin_du_Jour.rexx()
  713. SAY CR
  714. RETURN temp
  715.  
  716.  
  717. send2log:
  718. PARSE ARG sendline
  719. logfile=bbspath'Logs/log.'DATE('S')    /* daily logs */
  720. fl='W'
  721. IF EXISTS(logfile) THEN fl='A'
  722. IF ~OPEN('log',logfile,fl) THEN
  723.   DO
  724.     IF ~OPEN('log',logfile,fl) THEN
  725.       DO
  726.         SAY 'failed to open log file'
  727.         RETURN
  728.      END
  729.   END
  730. CALL WRITELN('log',sendline)
  731. CALL CLOSE('log')
  732. IF bbsprefs.3=1 THEN CALL WRITELN(p,sendline)
  733. RETURN
  734.  
  735.  
  736. send2last:
  737. PARSE ARG sendline 
  738. IF bbsprefs.24~=1 & name=sysop THEN RETURN
  739. ADDRESS AREXX bbsLog99.rexx 'USER' sendline
  740. RETURN
  741.  
  742.  
  743. do_quick:
  744. ARG flag .
  745. CALL postfour('QUICK:')
  746. IF FIND(UPPER(data.8),'QUICK')=0 THEN
  747.   DO
  748.     SAY CR
  749.     SAY 'The QUICK option is OFF in your current settings.'CR
  750.     SAY CR
  751.     SAY 'Setting the QUICK option to ON will allow you to tell the BBS to'CR
  752.     SAY 'make a .lha archive of all new bbs activity since your last call.'CR
  753.     SAY CR
  754.     SAY 'This archive can then be read (and replied to, and files can be'CR
  755.     SAY 'uploaded and downloaded) using 'pen3'bbsQUICK.rexx'def', the offline read/reply'CR
  756.     SAY 'module for BBBBS, which is available here in the file libraries.'CR
  757.     SAY CR
  758.     IF getinput(1 1 'Turn the QUICK option ON? (Ny) > ')~='Y' THEN RETURN
  759.     data.8=data.8 'QUICK'
  760.     CALL savedata(0)
  761.   END
  762. ELSE IF flag=1 THEN
  763.   DO
  764.     IF getinput(1 1 'Turn the QUICK option OFF? (Ny) > ')='Y' THEN
  765.       DO 
  766.         temp=data.8
  767.         data.8=''
  768.         DO i=1 TO WORDS(temp)
  769.           IF WORD(temp,i)~='QUICK' THEN data.8=STRIP(data.8 WORD(temp,i))
  770.         END
  771.         ADDRESS COMMAND 'c:delete' bbspath'EmailFiles/'name'/QUICK_#?'
  772.         RETURN
  773.       END
  774.   END
  775. IF getinput(1 1 'Edit your QUICK exclude list? (Ny) > ')='Y' THEN
  776.   DO
  777.     SAY CR
  778.     SAY 'You may EXCLUDE any of these from your QUICK archives.'CR
  779.     SAY pen3||LEFT('-',74,'-')||def||CR
  780.     temp=LEFT(' ',7)
  781.     SAY temp'HELLO          - Pre-logon message.'CR
  782.     SAY temp'WELCOME        - Post-logon message.'CR
  783.     SAY temp'GOODBYE        - Logoff message.'CR
  784.     SAY temp'HOURLY         - Average-Minutes-Per-Hour usage graph.'CR
  785.     SAY temp'STATS.BBS      - Most of the Z command from the main menu.'CR
  786.     SAY temp'filename       - ANY filename in the Information area.'CR
  787.     SAY temp'MESSAGES       - New conference messages.'CR
  788.     SAY temp'FILELIST       - New file descriptions.'CR
  789.     SAY pen3||LEFT('-',74,'-')||def||CR
  790.     SAY 'Enter a space separated list of what you wish to exclude.'CR
  791.     SAY pen3'Exclude:'def data.26||CR
  792.     temp=getinput(1 0 pen3'Exclude: 'def)
  793.     IF temp='' & data.26~='' THEN
  794.       DO
  795.         IF getinput(1 1 'Clear the QUICK exclude list? (nY) > ')~='N' THEN
  796.           data.26=''
  797.       END
  798.     ELSE data.26=temp
  799.     temp='Your QUICK archives will exclude'pen3
  800.     IF data.26='' THEN temp=temp 'nothing!'
  801.     ELSE temp=temp data.26
  802.     SAY temp||def||CR
  803.     CALL savedata(0)
  804.     SAY CR
  805.   END
  806. IF GETCLIP('BBS_'name)~='' THEN
  807.   DO
  808.     SAY CR
  809.     SAY 'The QUICK routines are still working on your archive...'CR
  810.     SAY 'Please try again later.'CR
  811.     SAY CR
  812.     RETURN
  813.   END
  814. quickdir=bbspath'EmailFiles/'name
  815. CALL MAKEDIR(quickdir)
  816. CALL setdir(quickdir)
  817. qdarg=scratch'/dirlist'
  818. ADDRESS COMMAND 'C:list >'qdarg quickdir'/QUICK_#? DATES'
  819. efiles=UPPER(SHOWDIR(quickdir))
  820. qflag=0
  821. das=0
  822. IF getinput(1 1 'Archive new BBS activity now? (Ny) > ')='Y' THEN
  823.   DO
  824.     das=1
  825.     SAY 'Working...'CR
  826.     DO i=1 TO WORDS(efiles)
  827.       qarg=WORD(efiles,i)
  828.       IF LEFT(qarg,6)='QUICK_' & RIGHT(qarg,4)='.LHA' THEN
  829.         DO
  830.           SAY CR
  831.           SAY 'There is already a QUICK_xxxxx.LHA file in your mailbox...'CR
  832.           SAY 'Activity request has been CANCELLED!'CR
  833.           SAY CR
  834.           das=0
  835.           LEAVE i
  836.         END
  837.     END
  838.   END
  839. IF das=1 THEN
  840.   DO
  841.     CALL SETCLIP('BBS_city',city)
  842.     CALL SETCLIP('BBS_'name'_26',data.26)
  843.     IF FIND(UPPER(data.26),'STATS.BBS')=0 THEN
  844.       CALL SETCLIP('BBS_statsarg',emailonline grand grand2 files.0)
  845.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  846.       CALL SETCLIP('BBS_'name'_22',data.22)
  847.     CALL MAKEDIR(bbspath'EmailFiles/'name)
  848.     CALL showmarked(0)
  849.     CALL SETCLIP('BBS_QUICKOUT_BAUD',bps)
  850.     ADDRESS AREXX bbsQUICKOUT.rexx name level lastbrowse WORD(data.16,2) data.21
  851.     CALL send2log('Started QUICKOUT at' TIME('C'))
  852.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  853.       DO
  854.         clear_marked=1
  855.         DO i=1 TO level
  856.           IF WORD(data.22,i)~=-1 THEN
  857.             lastread.i=countcheck('Numbers/LastMessage'i 0)
  858.         END
  859.       END
  860.     IF FIND(UPPER(data.26),'FILELIST')=0 THEN
  861.       lastbrowse=countcheck('Numbers/LastFile' 0)
  862.     newfilesdate=DATE('S') TIME()
  863.     IF writeopen(bbspath'EmailFiles/'name'/Libraries') THEN
  864.       DO
  865.         DO i=1 TO libs.0
  866.           CALL WRITELN(f,libs.i)
  867.         END
  868.         CALL CLOSE(f)
  869.       END
  870.     IF writeopen(bbspath'EmailFiles/'name'/Conferences') THEN
  871.       DO
  872.         DO i=1 TO msgs.0
  873.           CALL WRITELN(f,msgs.i)
  874.         END
  875.         CALL CLOSE(f)
  876.       END
  877.     CALL savedata(1)
  878.     qflag=1
  879.   END
  880. IF WORD(STATEF(qdarg),2)>80 THEN
  881.   DO
  882.     CALL showtext(qdarg 0)
  883.     SAY CR
  884.   END
  885. DO qi=1 TO WORDS(efiles)
  886.   qarg=WORD(efiles,qi)
  887.   IF LEFT(qarg,6)='QUICK_' & RIGHT(qarg,4)='.LHA' THEN
  888.     DO
  889.       SAY qarg 'is' WORD(STATEF(qarg),2) 'bytes.'CR
  890.       allargs=qarg
  891.       DO WHILE dload2()=1
  892.       END
  893.       t=''
  894.       DO WHILE t~='N' & t~='Y'
  895.         t=getinput(1 1 'Delete' qarg'? (ny) > ')
  896.       END
  897.       IF t='Y' THEN
  898.         DO
  899.           IF DELETE(quickdir'/'qarg)=1 THEN SAY qarg 'deleted.'CR
  900.           CALL DELETE(quickdir'/'qarg'.xdl')
  901.           qarg=COMPRESS(UPPER(qarg),'QUICK_.LHA')
  902.           CALL DELETE(bbspath'Email/'name'/BBBBS.'qarg)
  903.         END
  904.     END
  905. END
  906. arg=''
  907. IF getinput(1 1 'Do you have a QUICKIN file to upload? (Ny) > ')='Y' THEN
  908.   DO
  909.     arg='QUICKIN.lha'
  910.     ul=2
  911.     DO WHILE ul=2
  912.       ul=uload(0)
  913.     END
  914.   END
  915. IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') & level>=sysoplevel THEN
  916.   IF getinput(1 1 'Process your QUICKIN archive [N]ow or at [L]ogoff? (Ln) > ')='N' THEN
  917.     DO
  918.       ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  919.       SAY CR
  920.       SAY 'Processing QUICKIN archive...'CR
  921.     END
  922. IF getinput(1 1 'Logoff Now? (nY) > ')~='N' THEN
  923.   DO
  924.     IF qflag THEN SAY 'Your archive will be waiting next time you call...'CR
  925.     SAY CR
  926.     SIGNAL LOGOUT2
  927.   END
  928. IF qflag THEN
  929.   DO
  930.     SAY CR
  931.     SAY 'Note: You now have no ''new'' files or messages (they are being archived).'CR
  932.     SAY CR
  933.     SAY 'You will be signaled if you are still online when your archive is ready...'CR
  934.     SAY CR
  935.     CALL waiting()
  936.   END
  937. CALL setdir(libpath||dirs.1)
  938. RETURN
  939.  
  940.  
  941. killuser:
  942. ARG kname .
  943. IF level<=sysoplevel THEN RETURN
  944. CALL bbsKillUser.rexx(kname)
  945. RETURN
  946.  
  947.  
  948. menus:
  949. CALL checkdcd()
  950. IF OPEN(f,bbspath'BBS_TEXT/MENU_'menu'.'colorflag,'R')~=0 THEN
  951.   DO
  952.     m=READCH(f,65000)
  953.     CALL CLOSE(f)
  954.     SAY m
  955.     IF level>sysoplevel THEN
  956.       DO
  957.         SAY ' ['pen3'K'def']ill a user      ['pen3'%'def'] edit filenote  ['pen3'='def'] level report'def||CR
  958.         SAY ' ['pen3'^'def'] view BBS logs  ['pen3'('def'] file report    ['pen3';'def'] change username'def||CR
  959.       END
  960.     IF level=99 THEN
  961.       SAY ' ['pen3'~'def'] online editor  ['pen3'@'def'] dos shell      ['pen3')'def'] email report'def||CR
  962.   END
  963. ELSE IF menu='NEW' THEN
  964.   DO
  965.     SAY pen6'     _________________'def||CR
  966.     SAY pen6'  __/  'pen3'New User Menu'pen6'  \___'def||CR
  967.     SAY pen6' |                        |'def||CR
  968.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  969.     SAY pen6' |'def'   ['pen3'I'def']nformation        'pen6'|'def||CR
  970.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def||CR
  971.     SAY pen6' |'def'   ['pen3'W'def']ho is here        'pen6'|'def||CR
  972.     SAY pen6' |'def'   ['pen3'S'def']earch user list   'pen6'|'def||CR
  973.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def||CR
  974.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def||CR
  975.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def||CR
  976.     SAY pen6' |'def'   ['pen3'X'def'] toggle menus     'pen6'|'def||CR
  977.     SAY pen6' |'def'   ['pen3'#'def'] toggle color     'pen6'|'def||CR
  978.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP   'pen6'|'def||CR
  979.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP   'pen6'|'def||CR
  980.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def||CR
  981.     SAY pen6' |________________________|'def||CR
  982.     IF bbsprefs.22~=0 THEN
  983.       DO
  984.         SAY CR
  985.         SAY 'Local Callers may register and receive' pen7'INSTANT VALIDATION'def'!'CR
  986.         SAY 'Enter R to ['pen3'R'def']egister using Call Back Verify.'CR
  987.       END
  988.   END
  989. ELSE IF menu='MSG' THEN
  990.   DO
  991.     SAY pen6'       ____________'def||CR
  992.     SAY pen6'  ____/  'pen3'Messages'pen6'  \_____'def||CR
  993.     SAY pen6' |                       |'def||CR
  994.     SAY pen6' |'def'   ['pen3'H'def']elp              'pen6'|'def||CR
  995.     SAY pen6' |'def'   ['pen3'P'def']ost messages     'pen6'|'def||CR
  996.     SAY pen6' |'def'   ['pen3'R'def']ead messages     'pen6'|'def||CR
  997.     SAY pen6' |'def'   ['pen3'S'def']earch messages   'pen6'|'def||CR
  998.     SAY pen6' |'def'   ['pen3'E'def']mail (private)   'pen6'|'def||CR
  999.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP  'pen6'|'def||CR
  1000.     SAY pen6' |'def'   ['pen3'QUICK'def'] options     'pen6'|'def||CR
  1001.     SAY pen6' |'def'   ['pen3'FL'def'] Friends List   'pen6'|'def||CR
  1002.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP  'pen6'|'def||CR
  1003. IF(level>sysoplevel) THEN DO
  1004.     SAY pen6' |'def'   ['pen3'^'def'] view BBS logs   'pen6'|'def||CR
  1005.     SAY pen6' |'def'   ['pen3')'def'] email report    'pen6'|'def||CR
  1006.     SAY pen6' |'def'   ['pen3'='def'] level report    'pen6'|'def||CR
  1007.     SAY pen6' |'def'   ['pen3';'def'] change username 'pen6'|'def||CR;END
  1008. IF(level=99) THEN DO
  1009.     SAY pen6' |'def'   ['pen3'~'def'] online editor   'pen6'|'def||CR
  1010.     SAY pen6' |'def'   ['pen3'@'def'] dos shell       'pen6'|'def||CR;END
  1011.     SAY pen6' |'def'   ['pen3'F'def']iles menu        'pen6'|'def||CR
  1012.     SAY pen6' |'def'   ['pen3'.'def'] main menu       'pen6'|'def||CR
  1013.     SAY pen6' |_______________________|'def||CR
  1014.   END
  1015. ELSE IF menu='FILE' THEN
  1016.   DO
  1017.     SAY pen6'         _________'def||CR
  1018.     SAY pen6'  ______/  'pen3'Files'pen6'  \_______'def||CR
  1019.     SAY pen6' |                        |'def||CR
  1020.     SAY pen6' |'def'   ['pen3'A'def']lphabetic list    'pen6'|'def||CR
  1021.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  1022.     SAY pen6' |'def'   ['pen3'B'def']rowse filenotes   'pen6'|'def||CR
  1023.     SAY pen6' |'def'   ['pen3'N'def']ew files list     'pen6'|'def||CR
  1024.     SAY pen6' |'def'   ['pen3'L'def']ist by Library    'pen6'|'def||CR
  1025.     SAY pen6' |'def'   ['pen3'F'def']ilelist archives  'pen6'|'def||CR
  1026.     SAY pen6' |'def'   ['pen3'S'def']earch files       'pen6'|'def||CR
  1027.     SAY pen6' |'def'   ['pen3'U'def']pload             'pen6'|'def||CR
  1028.     SAY pen6' |'def'   ['pen3'D'def']ownload           'pen6'|'def||CR
  1029.     SAY pen6' |'def'   ['pen3'T'def']ransfer protocol  'pen6'|'def||CR
  1030.     SAY pen6' |'def'   ['pen3'+'def'] Extra Devices    'pen6'|'def||CR
  1031. IF(level>sysoplevel) THEN DO
  1032.     SAY pen6' |'def'   ['pen3'K'def']ill a user        'pen6'|'def||CR
  1033.     SAY pen6' |'def'   ['pen3'%'def'] edit filenote    'pen6'|'def||CR
  1034.     SAY pen6' |'def'   ['pen3'('def'] file report      'pen6'|'def||CR
  1035.     SAY pen6' |'def'   ['pen3';'def'] change username  'pen6'|'def||CR;END
  1036. IF(level=99) THEN DO
  1037.     SAY pen6' |'def'   ['pen3'@'def'] dos shell        'pen6'|'def||CR;END
  1038.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def||CR
  1039.     SAY pen6' |'def'   ['pen3'.'def'] main menu        'pen6'|'def||CR
  1040.     SAY pen6' |________________________|'def||CR
  1041.   END
  1042. ELSE IF menu='MAIN' THEN
  1043.   DO
  1044.     SAY pen6'       _____________'def||CR
  1045.     SAY pen6'  ____/  'pen3'Main Menu'pen6'  \_____'def||CR
  1046.     SAY pen6' |                        |'def||CR
  1047.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  1048.     SAY pen6' |'def'   ['pen3'I'def']nfomation         'pen6'|'def||CR
  1049.     SAY pen6' |'def'   ['pen3'J'def']ump to doorways   'pen6'|'def||CR
  1050.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def||CR
  1051.     SAY pen6' |'def'   ['pen3'W'def']ho is here list   'pen6'|'def||CR
  1052.     SAY pen6' |'def'   ['pen3'S'def']earch userlist    'pen6'|'def||CR
  1053.     SAY pen6' |'def'   ['pen3'O'def']ther users info   'pen6'|'def||CR
  1054.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def||CR
  1055.     SAY pen6' |'def'   ['pen3'X'def']pert (no menus)   'pen6'|'def||CR
  1056.     SAY pen6' |'def'   ['pen3'#'def'] toggle colors    'pen6'|'def||CR
  1057.     SAY pen6' |'def'   ['pen3'$'def'] toggle menu(s)   'pen6'|'def||CR
  1058.     SAY pen6' |'def'   ['pen3'&'def'] user profiles    'pen6'|'def||CR
  1059.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def||CR
  1060.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def||CR
  1061.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def||CR
  1062.     SAY pen6' |'def'   ['pen3'F'def']iles menu         'pen6'|'def||CR
  1063.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def||CR
  1064.     SAY pen6' |________________________|'def||CR
  1065.   END
  1066. ELSE IF menu='ALL' THEN
  1067.   DO
  1068.     SAY pen6'     __________________________________________________________'def||CR
  1069.     SAY pen6'  __/   'pen3'Main Menu            File Menu          Message Menu 'pen6'  \__'def||CR
  1070.     SAY pen6' |                                                                |'def||CR
  1071.     SAY pen6' |'def' ['pen3'H'def']elp               ['pen3'A'def']lphabetical list  ['pen3'P'def']ost messages      'pen6'|'def||CR
  1072.     SAY pen6' |'def' ['pen3'I'def']nformation        ['pen3'B'def']rowse filenotes   ['pen3'R'def']ead messages      'pen6'|'def||CR
  1073.     SAY pen6' |'def' ['pen3'Z'def'] bbs statiZtics   ['pen3'L'def']ist by Library    ['pen3'E'def']mail (private)    'pen6'|'def||CR
  1074.     SAY pen6' |'def' ['pen3'Y'def']our user data     ['pen3'N'def']ew files          ['pen3'C'def']omment to SYSOP   'pen6'|'def||CR
  1075.     SAY pen6' |'def' ['pen3'O'def']ther users info   ['pen3'F'def']ilelist archiver  ['pen3'!'def'] YELL for SYSOP   'pen6'|'def||CR
  1076.     SAY pen6' |'def' ['pen3'J'def']ump to doorways   ['pen3'+'def'] Extra Devices    ['pen3'X'def']pert (no menus)   'pen6'|'def||CR
  1077.     SAY pen6' |'def' ['pen3'S'def']earch menu        ['pen3'D'def']ownload           ['pen3'$'def'] toggle menu(s)   'pen6'|'def||CR
  1078.     SAY pen6' |'def' ['pen3'&'def'] user profiles    ['pen3'U'def']pload             ['pen3'#'def'] toggle colors    'pen6'|'def||CR
  1079.     SAY pen6' |'def' ['pen3'V'def']iew user log      ['pen3'T'def']ransfer protocol  ['pen3','def'] hourly stats     'pen6'|'def||CR
  1080.     SAY pen6' |'def' ['pen3'G'def']oodbye (logoff)   ['pen3'QUICK'def'] options      ['pen3'FL'def'] Friends List    'pen6'|'def||CR
  1081. IF(level>sysoplevel) THEN DO
  1082.     SAY pen6' |'def' ['pen3'K'def']ill a user        ['pen3'%'def'] edit filenote    ['pen3'='def'] level report     'pen6'|'def||CR
  1083.     SAY pen6' |'def' ['pen3'^'def'] view BBS logs    ['pen3'('def'] file report      ['pen3';'def'] change username  'pen6'|'def||CR;END
  1084. IF(level=99) THEN
  1085.     SAY pen6' |'def' ['pen3'~'def'] online editor    ['pen3'@'def'] dos shell        ['pen3')'def'] email report     'pen6'|'def||CR
  1086.     SAY pen6' |________________________________________________________________|'def||CR
  1087.   END
  1088. QUEUE CR  /* clears any un-CRed input in the queue */
  1089. RETURN
  1090.  
  1091.  
  1092. help:
  1093. ARG helppath .
  1094. SAY CR
  1095. SAY 'For more detailed help, use ['pen3'I'def']nformation commmand to read BBBBS.COMMANDS.'CR
  1096. IF helppath='MAIN' THEN
  1097.   SAY 'Commands available from the' pen3||menu||def 'menu:'CR
  1098. frontend=bbspath'BBS_HELP/'helppath
  1099. backend='.USER'
  1100. IF level=0 THEN backend='.NEW'
  1101. ELSE IF level=99 THEN backend='.SUPER'
  1102. ELSE IF level>sysoplevel THEN backend='.SYSOP'
  1103. CALL showtext(frontend||backend 1)
  1104. RETURN
  1105.  
  1106.  
  1107. waiting:
  1108. CALL checktime()
  1109. IF waitchar='Q' THEN
  1110.   DO
  1111.     waitchar=''
  1112.     RETURN
  1113.   END
  1114. waitchar=''
  1115. IF nonstop=1 THEN RETURN
  1116. OPTIONS PROMPT pen3'                          RETURN=Continue 'def
  1117. PULL waitchar
  1118. CALL cleanline(1)
  1119. CALL checkdcd()
  1120. RETURN
  1121.  
  1122.  
  1123. waiting2:
  1124. CALL checktime()
  1125. IF nonstop=1 THEN RETURN 0
  1126. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  1127. IF waitchar='N' THEN
  1128.   DO
  1129.     nonstop=1
  1130.     SAY lineup||pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def||CR
  1131.     SAY CR
  1132.     CALL DELAY(99)
  1133.     waitchar=''
  1134.   END
  1135. CALL cleanline(1)
  1136. CALL checkdcd()
  1137. IF waitchar='Q' THEN RETURN 1
  1138. RETURN 0
  1139.  
  1140.  
  1141. busywait:
  1142. ARG bii bi bt 
  1143. IF bii>4 & bi//(10*bii)=0 THEN CALL checkdcd()
  1144. IF bbsprefs.21=0 THEN RETURN
  1145. IF bi<1 THEN
  1146.   DO
  1147.     CALL WRITECH(STDOUT,'080808'x)
  1148.     IF ni<1 & i>999998 & wi>999998 THEN SAY CR
  1149.     RETURN
  1150.   END
  1151. IF bi=1 THEN CALL WRITECH(STDOUT,'   ')
  1152. IF bi//(bii%2)~=0 THEN RETURN
  1153. b=bi//bii
  1154. IF b=0 | b=bii%2 THEN
  1155.   DO
  1156.     tp=RIGHT((bi*100)%bt,2)'%'
  1157.     CALL WRITECH(STDOUT,'080808'x||tp)
  1158.   END
  1159. RETURN
  1160.  
  1161.  
  1162. cleanline:
  1163. ARG lflag .
  1164. IF nonstop=0 & clr~='' THEN
  1165.   DO
  1166.     Send clr
  1167.     RETURN
  1168.   END
  1169. cline=lineup||LEFT(' ',78)
  1170. IF lflag=1 THEN cline=cline||lineup
  1171. SAY cline||CR
  1172. RETURN
  1173.  
  1174.  
  1175. getinput:
  1176. PARSE ARG upflag' 'oneflag' 'pline
  1177. CALL checkdcd()
  1178. OPTIONS PROMPT pline
  1179. PARSE PULL inarg
  1180. inarg=STRIP(inarg)
  1181. IF upflag THEN inarg=UPPER(inarg)
  1182. IF oneflag THEN inarg=LEFT(inarg,1)
  1183. inarg=cleanstring(0':'inarg)
  1184. RETURN inarg
  1185.  
  1186.  
  1187. docity:
  1188. PARSE ARG citi
  1189. citi=TRANSLATE(citi,'          ','+-.,*/()<>')
  1190. DO i=WORDS(citi) TO 1 BY -1
  1191.   IF DATATYPE(WORD(citi,i),'N') THEN citi=STRIP(DELWORD(citi,i,1))
  1192.   IF UPPER(WORD(citi,i))='USA' THEN citi=STRIP(DELWORD(citi,i,1))
  1193. END
  1194. citi=SPACE(citi,1)
  1195. RETURN STRIP(citi)
  1196.  
  1197.  
  1198. postuser:
  1199. IF bbsprefs.12~=1 | ~SHOW('P','BBSPOST') THEN RETURN
  1200. ARG upflag .
  1201. IF upflag=6 THEN ptext='Logoff:' DATE() TIME('C')'  'name city
  1202. ELSE IF upflag=7 THEN ptext=name'  is a NEW USER!'
  1203. ELSE ptext='LogOn:' logontime'  'name city'  Last On:' DATE(,lastondate,'I')
  1204. ptext=CENTER(ptext,74)
  1205. CALL SETCLIP('BBSPOST1',ptext)
  1206. age='?'
  1207. IF UPPER(WORD(data.12,3))='BIRTHDAY:' THEN
  1208.   DO
  1209.     IF DATATYPE(WORD(data.12,4),'W') THEN
  1210.       DO
  1211.         age=LEFT(DATE('S'),4)-LEFT(WORD(data.12,4),4)
  1212.         IF SUBSTR(DATE('S'),5,2)<SUBSTR(WORD(data.12,4),5,2) THEN age=age-1
  1213.       END
  1214.   END
  1215. IF age='?' & WORD(data.12,4)~='' THEN age=WORD(data.12,4)
  1216. ptext=CENTER('Baud:' bps'   Age:' age'   Usage:' data.19,74)
  1217. CALL SETCLIP('BBSPOST2',ptext)
  1218. ptext2=''
  1219. ptext1=data.1'   '
  1220. IF DATATYPE(WORD(data.12,1),'W') THEN
  1221.   ptext2=ptext2'   First On:' DATE(,WORD(data.12,1),'S')
  1222. n=74-LENGTH(ptext1)-LENGTH(ptext2)
  1223. ptext2=ptext1||STRIP(LEFT(data.9,n))||ptext2
  1224. ptext2=CENTER(ptext2,74)
  1225. CALL SETCLIP('BBSPOST3',ptext2)
  1226. ulb=WORD(data.14,3)
  1227. IF ~DATATYPE(ulb,'W') | ulb=0 THEN ulb=1
  1228. dlb=WORD(data.15,3)
  1229. IF ~DATATYPE(dlb,'W') THEN dlb=0
  1230. ptext='Level: 'level'   dl/ul:' comma(TRUNC(dlb/ulb+.005,2))
  1231. IF upflag=0 THEN ptext=ptext
  1232. IF upflag=1 THEN ptext=ptext'   Cmd:' opt arg
  1233. IF upflag=2 THEN ptext=ptext'   MSG:' msg.msgdir
  1234. IF upflag=3 THEN ptext=ptext'   Email'
  1235. IF upflag=4 THEN ptext=ptext'   ul:' plaindir'/'arg
  1236. IF upflag=5 THEN ptext=ptext'   dl:' plaindir'/'arg
  1237. IF upflag=6 THEN ptext=ptext'   Elapsed:'elapsed' '
  1238. CALL SETCLIP('BBSPOST4',CENTER(ptext,74))
  1239. ADDRESS BBSPOST 'UPDATE'
  1240. ptext=''
  1241. IF EXISTS(bbspath'Email/'sysop'/NEW_FILES') THEN ptext='NEW_FILES !'
  1242. IF EXISTS(bbspath'Lists/CBV_USERS') THEN ptext=ptext 'CBV_USERS !'
  1243. IF EXISTS(bbspath'Lists/NEW_USERS') THEN ptext=ptext 'NEW_USERS !'
  1244. IF chatrequest=1 THEN ptext=ptext 'CHAT REQUEST !'
  1245. ptext=STRIP(ptext GETCLIP('BBS_ERROR'))
  1246. CALL SETCLIP('BBS_ERROR')
  1247. IF ptext='' THEN ptext=' '
  1248. ELSE ptext=CENTER('!' ptext,74)
  1249. IF ptext~=GETCLIP('BBSPOST5') THEN
  1250.   DO
  1251.     CALL SETCLIP('BBSPOST5',ptext)
  1252.     ADDRESS BBSPOST 'UPDATE'
  1253.   END
  1254. RETURN
  1255.  
  1256.  
  1257. postfour:
  1258. PARSE ARG parg 
  1259. IF bbsprefs.12~=1 | ~SHOW('P','BBSPOST') THEN RETURN
  1260. ptext='Level: 'level'   dl/ul:' comma(TRUNC(dlb/ulb+.005,2))
  1261. CALL SETCLIP('BBSPOST4',CENTER(ptext'   'parg,74))
  1262. ADDRESS 'BBSPOST' 'UPDATE'
  1263. RETURN
  1264.  
  1265.  
  1266. whodat:
  1267. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  1268. RETURN
  1269.  
  1270.  
  1271. showtime:
  1272. mins=TIME('E')%60
  1273. secs=TRUNC(TIME('E')//60)+1
  1274. IF secs>59 THEN secs=59
  1275. IF secs<10 THEN secs='0'secs
  1276. line=' Time:  Used' mins':'secs
  1277. mins=(maxtime-TIME('E'))%60
  1278. secs=TRUNC((maxtime-TIME('E'))//60)
  1279. IF secs<10 THEN secs='0'secs
  1280. line=line'   Remaining' mins':'secs
  1281. SAY line||CR
  1282.  
  1283. checktime:
  1284. IF TIME('E')>maxtime THEN
  1285.   DO
  1286.     SAY 'Sorry,' name 'your time has expired.'CR
  1287.     CALL send2log('*** Time Expired ***')
  1288.     SIGNAL LOGOUT2
  1289.   END
  1290. IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
  1291. CALL whodat()
  1292. CALL checkemail()
  1293. CALL checkdcd()
  1294. RETURN
  1295.  
  1296.  
  1297. setdir:
  1298. PARSE ARG tempdir
  1299. CALL PRAGMA('D',STRIP(tempdir))
  1300. directory=PRAGMA('D')
  1301. Data directory
  1302. slash=LASTPOS('/',directory)
  1303. IF slash=0 THEN slash=LASTPOS(':',directory)
  1304. plaindir=directory
  1305. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  1306. RETURN
  1307.  
  1308.  
  1309. config:
  1310. arg='s:CONFIG.BBS'
  1311. IF ~EXISTS(arg) THEN arg='BBS:BBS_TEXT/CONFIG.BBS'
  1312. IF readlines(arg 1) THEN
  1313.   DO
  1314.     SAY 's:CONFIG.BBS and BBS:BBS_TEXT/CONFIG.BBS are both missing!'CR
  1315.     SIGNAL DONE2
  1316.   END
  1317. compos=POS('/*',lynes.1)
  1318. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  1319. bbsname=STRIP(lynes.1)
  1320. CALL SETCLIP('BBS_bbsname',bbsname)
  1321. sysop=WORD(lynes.2,1)
  1322. compos=POS('/*',lynes.3)
  1323. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  1324. exclusion=STRIP(lynes.3)
  1325. bbsdevice=WORD(lynes.4,1)
  1326. sysoplevel=WORD(lynes.5,1)
  1327. bbspath=WORD(lynes.6,1)
  1328. IF ~EXISTS(bbspath) THEN
  1329.   DO
  1330.     SAY bbspath 'does not exist!'CR
  1331.     SIGNAL DONE2
  1332.   END
  1333. testchar=RIGHT(bbspath,1)
  1334. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  1335. CALL SETCLIP('BBS_path',bbspath)
  1336. msgpath=WORD(lynes.7,1)
  1337. IF ~EXISTS(msgpath) THEN
  1338.   DO
  1339.     SAY msgpath 'does not exist!'CR
  1340.     SIGNAL DONE2
  1341.   END
  1342. testchar=RIGHT(msgpath,1)
  1343. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  1344. CALL SETCLIP('BBS_msgpath',msgpath)
  1345. msgpath=msgpath'MSG'
  1346. libpath=WORD(lynes.8,1)
  1347. IF ~EXISTS(libpath) THEN
  1348.   DO
  1349.     SAY libpath 'does not exist!'CR
  1350.     SIGNAL DONE2
  1351.   END
  1352. testchar=RIGHT(libpath,1)
  1353. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  1354. CALL SETCLIP('BBS_libpath',libpath)
  1355. extdevs=''
  1356. DO i=1 TO WORDS(lynes.10)
  1357.   test=WORD(lynes.10,i)
  1358.   IF POS(':',test)=0 THEN ITERATE i
  1359.   IF LEFT(test,2)='/*' THEN LEAVE i
  1360.   extdevs=STRIP(extdevs test)
  1361. END
  1362. SYSTEM_MSG_LIMIT=WORD(lynes.11,1)
  1363. SYSTEM_SPACE_LIMIT=WORD(lynes.12,1)
  1364. maxidle=WORD(lynes.13,1)
  1365. maxtime=WORD(lynes.14,1)
  1366. maxbps=WORD(lynes.15,1)
  1367. IF ~DATATYPE(maxbps,'W') THEN maxbps=2400
  1368. CALL SETCLIP('BBS_baud',maxbps)
  1369. DO i=16 TO 41
  1370.   j=i-15
  1371.   bbsprefs.j=STRIP(WORD(lynes.i,1))
  1372. END
  1373. spellpath=WORD(lynes.9,1)
  1374. IF bbsprefs.5 & ~EXISTS(spellpath) THEN
  1375.   DO
  1376.     SAY spellpath 'does not exist!'CR
  1377.     bbsprefs.5=0
  1378.   END
  1379. IF bbsprefs.10 THEN scratch=bbspath'Scratch'
  1380. ELSE scratch='RAM:Scratch'
  1381. CALL MAKEDIR(scratch)
  1382. IF bbsprefs.12=1 THEN
  1383.   IF ~SHOW('P','BBSPOST') THEN ADDRESS AREXX bbsPOST.baud
  1384. IF ~DATATYPE(bbsprefs.16,'W') THEN bbsprefs.16=3
  1385. extension=WORD(lynes.32,1)
  1386. arccom=lynes.33
  1387. compos=POS('/*',lynes.33)
  1388. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  1389. arccom=STRIP(lynes.33)
  1390. IF LEFT(extension,1)~='.' THEN
  1391.   DO
  1392.     extension='.lzh'
  1393.     arccom='lharc -m m'
  1394.   END
  1395. lpost=WORD(lynes.34,1)
  1396. IF ~DATATYPE(lpost,'W') THEN lpost=3
  1397. rpost=WORD(lynes.35,1)
  1398. IF ~DATATYPE(rpost,'W') THEN rpost=11
  1399. IF SHOW('P','BBSPOST') THEN ADDRESS 'BBSPOST' 'CONFIG' lpost rpost
  1400. compos=POS('/*',lynes.42)
  1401. IF compos>0 THEN lynes.42=LEFT(lynes.42,compos-1)
  1402. bbsprefs.27=STRIP(lynes.42)
  1403. real=1
  1404. IF WORD(lynes.43,1)=0 THEN real=0
  1405. RETURN
  1406.  
  1407.  
  1408. readlogs:
  1409. t=getinput(1 1 'Read [D]aily, [N]umbers, or [Q]uick log? (dnq) > ')
  1410. IF t='' THEN RETURN
  1411. IF t='D' THEN
  1412.   DO
  1413.     arg=getinput(1 0 '['pen3'RETURN'def']=TODAY, or enter Log Date ('pen3||DATE('S')||def') > ')
  1414.     IF arg='' THEN arg=DATE('S')
  1415.     arg=bbspath'Logs/log.'arg
  1416.   END
  1417. ELSE IF t='N' THEN arg=bbspath'logs/QUICK.log'
  1418. ELSE IF t='Q' THEN arg=bbspath'logs/Numbers.log'
  1419. ELSE RETURN
  1420. CALL showtext(arg 1)
  1421. RETURN
  1422.  
  1423.  
  1424. loadcourtesy:
  1425. IF courtesyflag=0 & courtesy='' & EXISTS(bbspath'Lists/Courtesy') THEN
  1426.   DO
  1427.     IF readopen(bbspath'Lists/Courtesy') THEN
  1428.       DO
  1429.         SAY 'Checking Courtesy List...'CR
  1430.         DO i=1
  1431.           line=READLN(f)
  1432.           IF EOF(f) THEN BREAK
  1433.           line=cleanstring(1':'line)
  1434.           courtesy=courtesy line
  1435.         END
  1436.         CALL CLOSE(f)
  1437.         MSG ''
  1438.         MSG pen3'Courtesy List:'def
  1439.         MSG courtesy
  1440.       END
  1441.   END
  1442. RETURN
  1443.  
  1444.  
  1445. fileheader:
  1446. SAY 'Filename          Bytes File# Library         KeyWords'CR
  1447. SAY pen3||LEFT('=',77,'=')||def||CR
  1448. RETURN
  1449.  
  1450.  
  1451. showalpha:
  1452. libtext=0
  1453. IF DATATYPE(arg,'W') THEN
  1454.   DO
  1455.     dirnum=arg
  1456.     arg=''
  1457.     test='Y'
  1458.     IF chdir2()>0 THEN
  1459.       DO
  1460.         libtext=1
  1461.         RETURN
  1462.       END
  1463.   END
  1464. ELSE
  1465.   DO
  1466.     test=getinput(1 1 'Show one library only? (Ny) > ')
  1467.     IF test='Y' THEN
  1468.       DO
  1469.         IF chdir()>0 THEN
  1470.           DO
  1471.             libtext=1
  1472.             RETURN
  1473.           END
  1474.       END
  1475.   END
  1476.  
  1477. showalpha2:
  1478. libtext=1
  1479. IF test='Y' THEN
  1480.   DO
  1481.     CALL postfour('AlphaList:' plaindir)
  1482.     lfile=libpath||plaindir'/.'STRIP(LEFT(plaindir,15))
  1483.     IF EXISTS(lfile) THEN
  1484.       DO
  1485.         CALL showtext(lfile 1)
  1486.         nonstop=0
  1487.         RETURN
  1488.       END
  1489.     filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))
  1490.   END
  1491. ELSE filecount=files.0
  1492. SAY '  'filecount 'files.'CR
  1493. CALL fileheader()
  1494. count=0
  1495. DO wi=1 TO alpha.0
  1496.   CALL busywait(60 wi alpha.0)
  1497.   IF test='Y' THEN
  1498.     DO
  1499.       IF count>=filecount THEN LEAVE wi
  1500.       IF UPPER(LEFT(plaindir,12))~=UPPER(LEFT(WORD(alpha.wi,5),12)) THEN
  1501.         ITERATE wi
  1502.     END
  1503.   jj=WORD(alpha.wi,4)
  1504.   IF jj>level | FIND(data.21,UPPER(dirs.jj))>0 THEN
  1505.     ITERATE wi
  1506.   CALL busywait(4 0)
  1507.   SAY alpha.wi||CR
  1508.   count=count+1
  1509.   IF (count+2)//linesperpage=0 & wi<alpha.0 THEN
  1510.     IF waiting2() THEN
  1511.       DO
  1512.         CALL busywait(4 1)
  1513.         LEAVE wi
  1514.       END
  1515.   CALL busywait(4 1)
  1516. END
  1517. CALL busywait(4 0)
  1518. nonstop=0
  1519. IF waitchar~='Q' THEN CALL waiting()
  1520. RETURN
  1521.  
  1522.  
  1523. otheruser:
  1524. SAY lm
  1525. CALL bbsOther.rexx(maxtime-TRUNC(TIME('E')) name sysoplevel real bbspath bbsname)
  1526. RETURN
  1527.  
  1528.  
  1529. changename:
  1530. ARG cname
  1531. IF level<=sysoplevel THEN RETURN
  1532. IF cname='' THEN cname=getinput(1 0 'Current Username (include underscore): ')
  1533. IF readlines(bbspath'Users/'cname 1)>0 THEN RETURN
  1534. IF WORD(lynes.20,1)>level THEN RETURN
  1535. CALL SETCLIP('BBS_oldname',cname)
  1536. CALL ChangeUserName.rexx()
  1537. ncname=GETCLIP('BBS_newname')
  1538. IF name=cname THEN name=ncname
  1539. IF GETCLIP('BBS_oldname')='' THEN
  1540.   CALL send2log('Name change from' cname 'to' ncname)
  1541. sortuserflag=1
  1542. CALL SETCLIP('BBS_oldname')
  1543. CALL SETCLIP('BBS_newname')
  1544. RETURN ncname
  1545.  
  1546.  
  1547. levelreport:
  1548. SAY lm
  1549. CALL bbsNewUsers.rexx(name level colorflag maxtime-TRUNC(TIME('E')))
  1550. RETURN
  1551.  
  1552.  
  1553. filereport:
  1554. SAY 'Searching for mismatches between files and filenotes...'CR
  1555. DO i=1 TO sysoplevel+1
  1556.   IF dirs.i='' THEN ITERATE
  1557.   SAY dirs.i'                               'lineup||CR
  1558.   rfiles=SHOWDIR(libpath||dirs.i)
  1559.   rnotes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  1560.   IF WORDS(rfiles)~=WORDS(rnotes) THEN
  1561.     DO
  1562.       line='Compare files & filenotes in'pen3 dirs.i||def'. '
  1563.       DO j=1 TO WORDS(rfiles)
  1564.         IF FIND(UPPER(rnotes),UPPER(WORD(rfiles,j)))=0 THEN
  1565.           line=line WORD(rfiles,j)
  1566.       END
  1567.       SAY line||CR
  1568.     END
  1569. END
  1570. Send '^G'
  1571. CALL waiting()
  1572. RETURN
  1573.  
  1574.  
  1575. mailreport:
  1576. SAY 'Checking ALL pending Email...'CR
  1577. SAY pen3' - Use CTRL-E to Exit -'def||CR
  1578. SAY CR
  1579. mailrep=SHOWDIR(bbspath'Email','D')
  1580. mailfil=SHOWDIR(bbspath'EmailFiles','D')
  1581. lastemail=WORD(data.17,3)
  1582. IF ~DATATYPE(lastemail,'W') THEN lastemail=0
  1583. IF lastemail=countcheck('Numbers/LastMail' 0) THEN
  1584.   DO
  1585.     DROP mailrep. mailfil.
  1586.     RETURN
  1587.   END
  1588. mailynes.=''
  1589. mk=0
  1590. DO mi=1 TO WORDS(mailrep)
  1591.   muser=WORD(mailrep,mi)
  1592.   IF muser=sysop | muser=name THEN ITERATE mi
  1593.   mlist=SHOWDIR(bbspath'Email/'muser)
  1594.   IF WORDS(mlist)>0 THEN SAY lineup||RIGHT(muser,40)||CR
  1595.   DO mj=1 TO WORDS(mlist)
  1596.     fuser=WORD(mlist,mj)
  1597.     IF POS(sysop,fuser)>0 THEN ITERATE mj
  1598.     IF logonflag=0 THEN
  1599.       DO
  1600.         mk=mk+1
  1601.         mailynes.mk=pen3||LEFT(muser,20) 'from'def LEFT(fuser,20) DATE(,WORD(STATEF(bbspath'Email/'muser'/'fuser),5),'I')
  1602.       END
  1603.     IF POS(sysop,fuser)=0 & POS(name,fuser)=0 THEN
  1604.       DO
  1605.         testnum=RIGHT(fuser,LENGTH(fuser)-LASTPOS('.',fuser))
  1606.         IF testnum>emailnum THEN emailnum=testnum
  1607.         IF testnum>lastemail THEN
  1608.           DO
  1609.             CALL showtext(bbspath'Email/'muser'/'fuser 1)
  1610.             SAY CR
  1611.             SAY CR
  1612.             IF waitchar='Q' THEN LEAVE mi
  1613.           END
  1614.       END
  1615.   END
  1616.   IF logonflag=0 & FIND(mailfil,muser)>0 THEN
  1617.     DO
  1618.       efilelist=SHOWDIR(bbspath'EmailFiles/'muser)
  1619.       IF WORDS(efilelist)>0 THEN
  1620.         DO
  1621.           mk=mk+1
  1622.           mailynes.mk=pen3||LEFT(muser,20) 'emailfiles'def efilelist
  1623.         END
  1624.     END
  1625. END
  1626. data.17=WORD(data.17,1) WORD(data.17,2) countcheck('Numbers/LastMail' 0)
  1627. IF mk>0 THEN
  1628.   DO
  1629.     lynes.0=mk
  1630.     DO mi=1 TO mk
  1631.       lynes.mi=mailynes.mi
  1632.     END
  1633.     CALL seelines(1)
  1634.     nonstop=0
  1635.     CALL waiting()
  1636.   END
  1637. ELSE SAY 'No unseen Email pending.'CR
  1638. DROP mailrep. mailfil. mailynes. mlist
  1639. RETURN
  1640.  
  1641.  
  1642. jump2rexx:
  1643. arg=bbspath'BBS_TEXT/REXXDOORS'
  1644. IF EXISTS(arg) THEN CALL showtext(arg 0)
  1645. CALL sound('JUMP')
  1646. SAY lm
  1647. CALL bbsDoors.rexx(TRUNC(maxtime-TIME('E'))-42 name password)
  1648. x=GETCLIP('BBS_maxtime')
  1649. CALL SETCLIP('BBS_maxtime')
  1650. IF DATATYPE(x,'W') THEN maxtime=x+TIME('E')
  1651. x=GETCLIP('BBS_winnings')
  1652. IF DATATYPE(x,'W') THEN winnings=x
  1653. CALL SETCLIP('BBS_winnings')
  1654. RETURN
  1655.  
  1656.  
  1657. sortlibraries:
  1658. SAY 'Sorting Libraries...'CR
  1659. count=0
  1660. sdirs.=''
  1661. DO i=1 TO level
  1662.   IF dirs.i='' THEN ITERATE i
  1663.   count=count+1
  1664.   sdirs.count=dirs.i i
  1665. END
  1666. sdirs.0=count
  1667. IF count>0 THEN CALL QSort(1,count,sdirs)
  1668. count=0
  1669. libs.=''
  1670. DO i=1 TO sdirs.0
  1671.   tempnum=WORD(sdirs.i,2)
  1672.   tempdir=WORD(sdirs.i,1)
  1673.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  1674.     DO
  1675.       string=' '
  1676.       IF tempnum<10 THEN string=string' '
  1677.       string=string || tempnum'. 'LEFT(tempdir,14)
  1678.       count=count+1
  1679.       libs.count=string
  1680.     END
  1681. END
  1682. libs.0=count%4
  1683. IF (count//4)>0 THEN libs.0=libs.0+1
  1684. DO i=1 TO libs.0
  1685.   DO j=1 TO 3
  1686.     k=i+j*libs.0
  1687.     IF k<=count THEN libs.i=libs.i||libs.k
  1688.   END
  1689. END
  1690. DROP sdirs.
  1691. RETURN
  1692.  
  1693.  
  1694. sortconferences:
  1695. SAY 'Sorting Conferences...'CR
  1696. count=0
  1697. smsg.=''
  1698. DO i=1 TO level
  1699.   IF msg.i='' THEN ITERATE i
  1700.   count=count+1
  1701.   smsg.count=msg.i i
  1702. END
  1703. smsg.0=count
  1704. IF count>0 THEN CALL QSort(1,count,smsg)
  1705. count=0
  1706. msgs.=''
  1707. DO i=1 TO smsg.0
  1708.   tempnum=WORD(smsg.i,2)
  1709.   tempdir=WORD(smsg.i,1)
  1710.   IF FIND(data.21,tempnum)=0 THEN
  1711.     DO
  1712.       string=' '
  1713.       IF tempnum<10 THEN string=string' '
  1714.       string=string || tempnum'.'
  1715.       IF WORD(data.22,tempnum)='' | WORD(data.22,tempnum)>=0 THEN
  1716.         string=string LEFT(tempdir,20)
  1717.       ELSE string=string pen2'-OFF-'def LEFT(tempdir,14)
  1718.       count=count+1
  1719.       msgs.count=string
  1720.     END
  1721. END
  1722. msgs.0=count%3
  1723. IF (count//3)>0 THEN msgs.0=msgs.0+1
  1724. DO i=1 TO msgs.0
  1725.   DO j=1 TO 2
  1726.     k=i+j*msgs.0
  1727.     IF k<=count THEN msgs.i=msgs.i msgs.k
  1728.   END
  1729. END
  1730. DROP smsg.
  1731. RETURN
  1732.  
  1733.  
  1734. readmessages:
  1735. SAY lm
  1736. CALL SETCLIP('BBSMSG_ARG',colorflag arg)
  1737. CALL bbsMsg.rexx(maxtime-TRUNC(TIME('E')) name password)
  1738. CALL loaddata()
  1739. CALL checkemail()
  1740. RETURN
  1741.  
  1742.  
  1743. showmarked:
  1744. ARG ff .
  1745. IF WORDS(data.24)<1 THEN RETURN
  1746. fline='These unread conference messages have been ['pen3'M'pen6']arked as addressed to you:'
  1747. IF ff THEN
  1748.   DO
  1749.     SAY CR
  1750.     SAY pen6||fline||def||CR
  1751.   END
  1752. tempkk=data.24
  1753. DO i=1 TO WORDS(tempkk)
  1754.   tempk=WORD(tempkk,i)
  1755.   PARSE VAR tempk kdir'/'kmsg
  1756.   line=RIGHT(kmsg,6) 'in the'pen3 msg.kdir def'conference'
  1757.   IF EXISTS(msgpath||tempk) THEN
  1758.     DO
  1759.       IF ff THEN SAY line'.'CR
  1760.       ELSE fline=fline'0A'x||line'.'
  1761.     END
  1762.   ELSE
  1763.     DO
  1764.       line=line 'is missing.'
  1765.       IF ff THEN SAY line||CR
  1766.       ELSE fline=fline'0A'x||line
  1767.       mkw=FIND(data.24,tempk)
  1768.       data.24=STRIP(DELWORD(data.24,mkw,1))
  1769.       CALL savedata(0)
  1770.     END
  1771. END
  1772. IF ff THEN
  1773.   DO
  1774.     CALL waiting()
  1775.     SAY CR
  1776.   END
  1777. ELSE
  1778.   DO
  1779.     IF writeopen(bbspath'EmailFiles/'name'/Marked')=0 THEN RETURN
  1780.     CALL WRITELN(f,fline)
  1781.     CALL CLOSE(f)
  1782.   END
  1783. RETURN
  1784.  
  1785.  
  1786. readmail:
  1787. ARG fromenu .
  1788. replysubj=''
  1789. IF fromenu THEN SAY lm
  1790. ELSE arg=''
  1791. CALL SETCLIP('BBSMAIL_ARG',fromenu arg)
  1792. allargs=bbsMail.rexx(maxtime-TRUNC(TIME('E')) name password)
  1793. CALL loaddata()
  1794. IF DATATYPE(allargs,'N') THEN allargs=''
  1795. IF allargs~='' THEN
  1796.   DO
  1797.     CALL dload2()
  1798.     CALL readmail(0)
  1799.   END
  1800. CALL checkemail()
  1801. RETURN
  1802.  
  1803.  
  1804. checkemail:
  1805. x=GETCLIP('BBS_email')
  1806. CALL SETCLIP('BBS_email')
  1807. If DATATYPE(x,'W') THEN
  1808.   IF emailonline>-1 THEN emailonline=emailonline+x
  1809. RETURN
  1810.  
  1811.  
  1812. countcheck:
  1813. PARSE ARG fname' 'cknum .
  1814. fname=bbspath||fname
  1815. IF ~EXISTS(fname) THEN
  1816.   DO
  1817.     IF cknum=0 THEN RETURN 0
  1818.     IF ~writeopen(fname) THEN RETURN 0
  1819.     CALL WRITELN(f,cknum)
  1820.     CALL CLOSE(f)
  1821.     RETURN cknum
  1822.   END
  1823. IF ~readopen(fname) THEN
  1824.   DO
  1825.     CALL DELAY(99)
  1826.     IF ~readopen(fname) THEN RETURN cknum
  1827.   END
  1828. retval=STRIP(READLN(f))
  1829. CALL CLOSE(f)
  1830. IF ~DATATYPE(retval,'W') THEN retval=0
  1831. IF ~DATATYPE(cknum,'W') THEN cknum=0
  1832. IF retval<cknum THEN
  1833.   DO
  1834.     IF writeopen(fname) THEN
  1835.       DO
  1836.         CALL WRITELN(f,cknum)
  1837.         CALL CLOSE(f)
  1838.         RETURN cknum
  1839.       END
  1840.   END
  1841. RETURN retval
  1842.  
  1843.  
  1844. sysED:
  1845. IF level<99 THEN RETURN
  1846. arg=getinput(0 0 'Textfile To Edit: ')
  1847. IF arg='' THEN RETURN
  1848. SAY lm
  1849. CALL bbsEd.rexx(1 arg name TRUNC(maxtime-TIME('E'))-28)
  1850. CALL checkfilechanges()
  1851. RETURN
  1852.  
  1853.  
  1854. editor:
  1855. PARSE ARG edarg
  1856. SAY lm
  1857. IF bbsWrite.rexx(edarg)=0 THEN RETURN
  1858. IF WORD(edarg,3)='MAIL' THEN
  1859.   DO
  1860.     IF emailonline>=0 THEN emailonline=emailonline+1
  1861.   END
  1862. ELSE
  1863.   DO
  1864.     grand=grand+1
  1865.     IF ~DATATYPE(msg.msgdir.0,'W') THEN msg.msgdir.0=1
  1866.     ELSE msg.msgdir.0=msg.msgdir.0+1
  1867.   END
  1868. CALL loaddata()
  1869. RETURN
  1870.  
  1871.  
  1872. edinfo:
  1873. PARSE ARG t1,t2,t3
  1874. IF level<sysoplevel THEN RETURN 0
  1875. IF getinput(1 1 'Edit the'pen3 t2 def||t3 'info file? (Ny) > ')='Y' THEN
  1876.   DO
  1877.     IF ~EXISTS(t) THEN
  1878.       DO
  1879.         IF writeopen(t1)~=0 THEN
  1880.           DO
  1881.             CALL WRITELN(f,TRIM(CENTER('***'pen3 t2 def||t3 '***',75)))
  1882.             CALL WRITELN(f,LEFT('',75,'='))
  1883.             CALL CLOSE(f)
  1884.             CALL DELAY(28)
  1885.           END
  1886.       END
  1887.     CALL bbsEd.rexx(1 t1 name TRUNC(maxtime-TIME('E'))-28)
  1888.     RETURN 1
  1889.   END
  1890. RETURN 0
  1891.  
  1892.  
  1893. shell:
  1894. SAY CR
  1895. olddir=PRAGMA('D')
  1896. DO WHILE(UPPER(opt)~='EXIT')
  1897.   SAY bak2||TIME('C')||def PRAGMA('D')||CR
  1898.   OPTIONS PROMPT pen3'Type EXIT to quit AmigaDOS> 'def
  1899.   PARSE PULL opt' 'arg
  1900.   CALL checkdcd()
  1901.   IF(UPPER(opt)='CD') THEN CALL setdir(arg)
  1902.   ELSE IF EXISTS(opt)~=0 THEN
  1903.     DO
  1904.       IF LEFT(STATEF(opt),3)='DIR' THEN CALL setdir(opt)
  1905.     END
  1906.   ELSE IF opt~='' & UPPER(opt)~='EXIT' THEN
  1907.     ADDRESS COMMAND opt '<* >*' arg
  1908. END
  1909. CALL PRAGMA('D',olddir)
  1910. RETURN
  1911.  
  1912.  
  1913. yell:
  1914. chatrequest=1
  1915. IF excuses.1='' THEN
  1916.   DO
  1917.     IF readopen(bbspath'Lists/Excuses') THEN
  1918.       DO
  1919.         DO i=1
  1920.           line=READLN(f)
  1921.           IF EOF(f) THEN BREAK
  1922.           excuses.i=line
  1923.         END
  1924.         excuses.0=i-1
  1925.         CALL CLOSE(f)
  1926.       END
  1927.   END
  1928. j=TIME('S')//excuses.0+1
  1929. SAY CR
  1930. SAY 'Sorry, your SysOp,' sysop','CR
  1931. IF excuses.j~='' THEN SAY excuses.j||CR
  1932. ELSE SAY 'is not available, please leave a ['pen3'C'def']omment.'CR
  1933. SAY CR
  1934. IF bbsprefs.13=1 THEN RETURN
  1935. SAY 'I''m yelling anyway...'CR
  1936. SAY 'If nobody answers, please try again later or leave a ['pen3'C'def']omment'CR
  1937. CALL sound('YELL')
  1938. ADDRESS AREXX bbsSpeak.rexx 'CHAT' name bbspath saypath
  1939. RETURN
  1940.  
  1941.  
  1942. /* online change to member. Sysop triggered by BumpMember.baud */
  1943. /* user triggered by Call Back Verification */
  1944. validate:
  1945. ARG varg .
  1946. IF readopen(bbspath'BBS_TEXT/'varg) THEN
  1947.   DO
  1948.     SAY CR
  1949.     SAY 'You are being validated.  Please wait...'CR
  1950.     SAY CR
  1951.     DO lvi=1 TO 22
  1952.       line=READLN(f)
  1953.       IF lvi=11 THEN data.11=line
  1954.       IF lvi=17 THEN data.17=WORD(line,1) WORD(data.17,2) WORD(data.17,3)
  1955.       IF lvi=20 THEN data.20=line
  1956.       IF lvi=21 THEN data.21=line
  1957.     END
  1958.     data.22=line
  1959.     CALL CLOSE(f)
  1960.     CALL setdata()
  1961.     CALL sortlibraries()
  1962.     CALL sortconferences()
  1963.     CALL setmsgs()
  1964.     SAY CR
  1965.     CALL logonstats()
  1966.     CALL savedata(0)
  1967.     IF EXISTS(bbspath'BBS_TEXT/EMAIL_WELCOME') THEN
  1968.       DO
  1969.         CALL MAKEDIR(bbspath'EMail/'name)
  1970.         lastwrit=countcheck('Numbers/LastMail' 0)+1
  1971.         IF lastwrit>1 THEN CALL countcheck('Numbers/LastMail' lastwrit)
  1972.         lynes.=''
  1973.         lynes.1=' Mail:' lastwrit
  1974.         lynes.2=' From:' sysop
  1975.         lynes.3='   To:' name
  1976.         lynes.4=' Subj: Welcome to' bbsname
  1977.         lynes.5=' Date:' DATE('W') DATE()'  'TIME('C')
  1978.         lynes.6=LEFT('',74,'=')
  1979.         CALL readlines(bbspath'BBS_TEXT/EMAIL_WELCOME' 7)
  1980.         CALL savelines(bbspath'EMail/'name'/'sysop'.'lastwrit)
  1981.         SAY 'You have welcoming EMail.'CR
  1982.       END
  1983.     CALL waiting()
  1984.     IF bbsprefs.22=2 & varg='DEF.CBV' THEN
  1985.       DO
  1986.         SAY CR
  1987.         SAY pen3||name def'is now a fully valadated member of'pen3 bbsname||def||CR
  1988.         SAY 'All the features of the BBS will be available on your next call.'CR
  1989.         SAY CR
  1990.         CALL waiting()
  1991.         SIGNAL LOGOUT2
  1992.       END
  1993.     SIGNAL RESTART
  1994.   END
  1995. ELSE
  1996.   DO
  1997.     SAY 'Sorry. Auto-validation is disabled.'CR
  1998.     temp=' ***' sysop'!  You need a default file in BBS_TEXT!  (' varg ') *** '
  1999.     MSG bak2||temp||def||CR
  2000.     CALL Send2log(temp)
  2001.   END
  2002. RETURN
  2003.  
  2004.  
  2005. /* online time change. Sysop triggered by BumpTime.baud */
  2006. uptime:
  2007. mins=GETCLIP('BBS_minutes')
  2008. IF DATATYPE(mins,'N') THEN
  2009.   DO
  2010.     IF (mins*60)>maxtime THEN
  2011.       SAY name', this session''s time has been increased to' mins 'minutes.'CR
  2012.     ELSE MSG '*** User has not been told that his time has decreased.'
  2013.     CALL SETCLIP('BBS_minutes')
  2014.     maxtime=mins*60
  2015.   END
  2016. RETURN
  2017.  
  2018.  
  2019. /* online level change. Sysop triggered by BumpLevels.baud */
  2020. uplevel:
  2021. levl=GETCLIP('BBS_level')
  2022. IF DATATYPE(levl,'W') THEN
  2023.   DO
  2024.     IF levl>data.20 THEN
  2025.       SAY name', your level has been changed from' data.20 'to' levl'.'CR
  2026.     ELSE MSG '*** User has not been told his level has been reduced.'
  2027.     data.20=levl
  2028.     CALL setdata()
  2029.     IF menu='NEW' THEN menu='ALL'
  2030.     CALL sortlibraries()
  2031.     CALL sortconferences()
  2032.   END
  2033. RETURN
  2034.  
  2035.  
  2036. /* online ratio change. Sysop triggered by BumpLevels.baud */
  2037. upratio:
  2038. rats=GETCLIP('BBS_ratio')
  2039. IF DATATYPE(rats,'W') THEN
  2040.   DO
  2041.     SAY name', your upload:download ratio has been changed to 1:'rats'.'CR
  2042.     data.17=rats'  'WORD(data.17,2)'  'WORD(data.17,3)
  2043.     CALL SETCLIP('BBS_ratio')
  2044.   END
  2045. RETURN
  2046.  
  2047.  
  2048. bytes2user:
  2049. PARSE ARG indx bytes .
  2050. tfiles=WORD(data.indx,1)
  2051. tbytes=WORD(data.indx,3)
  2052. IF ~DATATYPE(tfiles,'W') THEN tfiles=0
  2053. IF ~DATATYPE(tbytes,'W') THEN tbytes=0
  2054. tbytes=tbytes+bytes
  2055. tfiles=tfiles+1
  2056. IF tfiles>1 THEN data.indx=tfiles 'files' tbytes 'bytes.'
  2057. ELSE data.indx='1 file' bytes 'bytes.'
  2058. data.indx=data.indx DATE()
  2059. CALL savedata(0)
  2060. RETURN
  2061.  
  2062.  
  2063. bbsspace:
  2064. ARG tabspace .
  2065. ADDRESS COMMAND 'C:info >'scratch'/infout' bbsdevice
  2066. ok=OPEN(f,scratch'/infout','R')
  2067. IF ok=0 THEN RETURN 20
  2068. line=READLN(f)
  2069. line=READLN(f)
  2070. line=READLN(f)
  2071. line=READLN(f)
  2072. CALL CLOSE(f)
  2073. IF tabspace<14 THEN SAY CR
  2074. bbsk=WORD(line,4)
  2075. IF ~DATATYPE(bbsk,'N') THEN
  2076.   DO
  2077.     line=bbsdevice 'is not an info compatible device!'
  2078.     CALL send2log(line)
  2079.     SAY pen3||line||def||CR
  2080.     bbsk=0
  2081.     RETURN
  2082.   END
  2083. bbsk=bbsk*512-SYSTEM_SPACE_LIMIT
  2084. IF bbsk<1 THEN bbsk=0
  2085. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'CR
  2086. RETURN
  2087.  
  2088.  
  2089. comma: PROCEDURE
  2090. ARG num .
  2091. t=''
  2092. x=POS('.',num)
  2093. IF x>0 THEN t=SUBSTR(num,x)
  2094. num=num%1
  2095. dgt=LENGTH(num)
  2096. numtext=''
  2097. IF dgt>3 THEN numtext=','RIGHT(num,3)
  2098. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  2099. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  2100. IF dgt>12 THEN
  2101.   DO
  2102.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  2103.     numtext=LEFT(num,dgt-12)||numtext
  2104.   END
  2105. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  2106. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  2107. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  2108. ELSE numtext=num
  2109. RETURN numtext||t
  2110.  
  2111.  
  2112. is_here:
  2113. ARG newname 
  2114. CALL WRITECH(STDOUT,'Checking filelist')
  2115. DO wi=1 TO 99
  2116.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  2117.   IF dirs.wi='' THEN ITERATE wi
  2118.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  2119.   line=pen3'*** File' newname 'already exists here'
  2120.   IF wi<=level THEN line=line 'in the' dirs.wi 'library'
  2121.   line=line'.'def
  2122.   SAY CR
  2123.   SAY line||CR
  2124.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'CR
  2125.   CALL waiting()
  2126.   RETURN 1
  2127. END
  2128. SAY CR
  2129. CALL cleanline(1)
  2130. RETURN 0
  2131.  
  2132.  
  2133. uload:
  2134. ARG frommenu
  2135. IF frommenu THEN
  2136.   DO
  2137.     SAY CR
  2138.     SAY pen3'PLEASE!'def 'Only upload 1 (one) archive at a time. NO BATCH UPLOADING! Thanks.'CR
  2139.   END
  2140. CALL bbsspace(12)
  2141. SAY CR
  2142. IF bbsk<1 THEN
  2143.   DO
  2144.     line='Upload area is full!'
  2145.     CALL send2log(line)
  2146.     SAY pen3||line||def||CR
  2147.     RETURN 1
  2148.   END
  2149. IF ~SHOW('P','BUILDALPHA') THEN CALL SETCLIP('BBS_UPLOAD')
  2150. IF frommenu & GETCLIP('BBS_UPLOAD')~='' THEN
  2151.   DO
  2152.     SAY pen3'Uploading is temporarily suspended while the filelists are rebuilding.'def
  2153.     CALL waiting()
  2154.     RETURN 1
  2155.   END
  2156. IF arg='' THEN arg=getinput(0 0 'Filename: ')  /* no filename given */
  2157. arg=cleanstring('0:'arg)
  2158. arg=COMPRESS(arg,' :/,;|#?*')  /* be sure no illegals here */
  2159. IF UPPER(arg)='RZ' | UPPER(LEFT(arg,4))='B000' THEN
  2160.   DO
  2161.     SAY CR
  2162.     SAY pen3'Error!'def arg 'is not allowed as a filename. Please try again.'CR
  2163.     CALL waiting()
  2164.     RETURN 1
  2165.   END
  2166. x=LASTPOS('/',arg)
  2167. IF x=0 THEN x=LASTPOS(':',arg)
  2168. IF x>0 THEN
  2169.   DO
  2170.     IF DATATYPE(SUBSTR(arg,x+1),'W') THEN
  2171.       DO
  2172.         SAY CR
  2173.         SAY pen3'Error!'def 'Whole numbers are not allowed as filenames!'CR
  2174.         CALL waiting()
  2175.         RETURN 1
  2176.       END
  2177.   END
  2178. tempnum=LENGTH(arg)-16
  2179. DO WHILE tempnum>0 & POS('EMAILFILES',UPPER(PRAGMA('D')))=0
  2180.   temp='          'pen3||arg def'is'pen3 tempnum||def
  2181.   IF tempnum=1 THEN temp=temp 'character'
  2182.   ELSE temp=temp 'characters'
  2183.   temp=temp 'too long for a filename.'
  2184.   SAY temp||CR
  2185.   arg=getinput(0 0 'Filename: ')
  2186.   arg=cleanstring('0:'arg)
  2187.   arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')
  2188.   tempnum=LENGTH(arg)-16
  2189. END
  2190. IF arg='' THEN RETURN 1
  2191. IF frommenu THEN
  2192.   DO
  2193.     IF is_here(arg) THEN RETURN 1
  2194.     IF wi=999999 THEN RETURN 1
  2195.     IF bbsprefs.6=1 & sysoplevel>level THEN CALL setdir(libpath'Sysops')
  2196.     ELSE
  2197.       DO loop=1
  2198.         SAY 'Please select an appropriate library for -' pen3||arg def'-'CR
  2199.         temp=chdir()
  2200.         IF temp=0 THEN LEAVE loop
  2201.         IF temp=2 THEN RETURN 1
  2202.       END
  2203.   END
  2204. checkproto='T'
  2205. targ=arg
  2206. DO WHILE checkproto='T'
  2207.   arg=''
  2208.   SAY CR
  2209.   SAY 'Library:'pen3 plaindir def'  Filename:'pen3 targ def'  Protocol:'pen3 protocol||def||CR
  2210.   pline=' ['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol'
  2211.   pline=pline '['pen3'U'def']pload (qtU) > '
  2212.   checkproto=getinput(1 1 pline)
  2213.   IF checkproto='Q' THEN RETURN 1
  2214.   IF checkproto='T' THEN CALL chpro()
  2215. END
  2216. arg=targ
  2217. CALL postuser(4)
  2218. CALL sound('UPLOAD')
  2219. uploadtime=TIME('E')
  2220. SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  2221. CALL whodat()
  2222. uldlflag=1
  2223. DownLoad arg
  2224. IF RC>0 THEN RETURN 2
  2225. IF bbsXferStats.baud(14 arg colorflag protocol) THEN RETURN 2
  2226. rbytes=WORD(STATEF(arg),2)
  2227. IF rbytes<1 THEN
  2228.   DO
  2229.     CALL DELETE(arg)
  2230.     RETURN 2
  2231.   END
  2232. temp=''
  2233. DO WHILE temp~='N' & temp~='Y'
  2234.   temp=getinput(1 1 'Received' rbytes 'bytes. Was your upload successful? (ny) > ')
  2235. END
  2236. IF temp='N' THEN RETURN 2
  2237. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  2238.   DO
  2239.     SAY CR
  2240.     SAY pen3'***'def arg pen3'failed archive check!'def||CR
  2241.     SAY CR
  2242.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  2243.     IF temp~='Y' THEN
  2244.       DO
  2245.         CALL DELETE(arg)
  2246.         SAY CR
  2247.         RETURN 2
  2248.       END
  2249.   END
  2250. CALL bytes2user(14 rbytes)
  2251. ADDRESS AREXX bbsNewFile.rexx name PRAGMA('D')'/'arg
  2252. IF bbsprefs.9 & name~=sysop THEN
  2253.   DO
  2254.     newufile=bbspath'EMail/'sysop'/NEW_FILES'
  2255.     IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  2256.     ELSE
  2257.       DO
  2258.         ok=OPEN(f,newufile,'W')
  2259.         IF ok~=0 THEN CALL WRITELN(f,'*** New Files ***') 
  2260.       END
  2261.     IF ok~=0 THEN CALL WRITELN(f,name 'uploaded' plaindir'/'arg'  'DATE() TIME())
  2262.     CALL CLOSE(f)
  2263.   END
  2264. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN
  2265.   DO
  2266.     uldlflag=0
  2267.     RETURN 0
  2268.   END
  2269. DO ui=sysoplevel+2 TO 100
  2270.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0   /* no filenotes */
  2271. END
  2272. IF frommenu THEN
  2273.   DO
  2274.     uploadtime=TIME('E')-uploadtime
  2275.     IF bbsprefs.11 THEN
  2276.       DO
  2277.         addtime=addtime+uploadtime
  2278.         maxtime=maxtime+uploadtime
  2279.         line='This session''s time has been increased by'
  2280.         line=line TRUNC(uploadtime%60+.05,1)+2 'minutes.'
  2281.         SAY CR
  2282.         SAY line||CR
  2283.         SAY 'Your ratio of bytes uploaded to bytes downloaded is 1:'ratio()||CR
  2284.       END
  2285.     CALL sound('NEW_FILE')
  2286.     uldlflag=0
  2287.     DO WHILE editnote(arg)  /* INSIST on a filenote */
  2288.     END
  2289.     CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  2290.     SAY pen3'Thank you for contributing to the' bbsname 'file libraries!'def||CR
  2291.   END
  2292. uldlflag=0
  2293. waitchar=''
  2294. RETURN 0
  2295.  
  2296.  
  2297. ratio:
  2298. upbytes=WORD(data.14,3)
  2299. IF ~DATATYPE(upbytes,'W') | upbytes<1 THEN upbytes=1
  2300. dnbytes=WORD(data.15,3)
  2301. IF ~DATATYPE(dnbytes,'W') | dnbytes<1 THEN dnbytes=1
  2302. RETURN TRUNC((dnbytes/upbytes)+.5)
  2303.  
  2304.  
  2305. findfiles:
  2306. PARSE ARG ffile .
  2307. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN ffile
  2308. wi=0
  2309. IF DATATYPE(ffile,'W') THEN
  2310.   DO
  2311.     IF WORDS(files.ffile)<2 THEN RETURN 0
  2312.     dirtemp=WORD(files.ffile,1)
  2313.     IF finddirnum(dirtemp)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  2314.       DO
  2315.         CALL illegal_access()
  2316.         RETURN 0
  2317.       END
  2318.     CALL setdir(libpath||dirtemp)
  2319.   END
  2320. ELSE IF EXISTS(ffile) THEN
  2321.   DO
  2322.     IF EXISTS(bbspath'FileNotes/'plaindir'/'ffile) THEN
  2323.       DO
  2324.         IF readopen(bbspath'FileNotes/'plaindir'/'ffile)~=0 THEN
  2325.           DO
  2326.             line=READLN(f)
  2327.             CALL CLOSE(f)
  2328.             ffile=WORD(line,2)
  2329.           END
  2330.       END
  2331.   END
  2332. ELSE IF EXISTS(bbspath'Information'ffile) THEN
  2333.   RETURN bbspath'Information/'ffile
  2334. ELSE
  2335.   DO
  2336.     nextfilenum=countcheck('Numbers/LastFile' 0)+1
  2337.     CALL busywait(4 1)
  2338.     DO ni=nextfilenum TO 0 BY -1
  2339.       IF ni<1 THEN
  2340.         DO
  2341.           CALL busywait(4 0)
  2342.           SAY CR
  2343.           SAY '***' files.0 'filenames scanned,'pen3 ffile def'is not on the filelist!'CR
  2344.           SAY CR
  2345.           RETURN 0
  2346.         END
  2347.       IF ni>1 THEN CALL busywait(60 ni nextfilenum)
  2348.       argtemp=WORD(files.ni,2)
  2349.       IF UPPER(argtemp)=UPPER(ffile) THEN
  2350.         DO
  2351.           dirtemp=WORD(files.ni,1)
  2352.           jj=files.ni.0
  2353.           IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  2354.             DO
  2355.               CALL busywait(4 0)
  2356.               CALL illegal_access()
  2357.               RETURN 0
  2358.             END
  2359.           ffile=ni
  2360.           CALL setdir(libpath||dirtemp)
  2361.           LEAVE ni
  2362.         END
  2363.     END
  2364.     CALL busywait(4 0)
  2365.   END
  2366. IF wi=999999 THEN RETURN 0
  2367. ftemp=ffile
  2368. IF DATATYPE(ftemp,'W') THEN ftemp=WORD(files.ftemp,2)
  2369. IF ~EXISTS(ftemp) THEN
  2370.   DO
  2371.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'ftemp)
  2372.     IF WORDS(finfo)>7 THEN ftemp=WORD(finfo,8)
  2373.     IF ~EXISTS(ftemp) THEN
  2374.       DO
  2375.         IF finfo='' THEN SAY '***'pen3 PRAGMA('D')'/'ftemp def'was not found!'CR
  2376.         ELSE
  2377.           DO
  2378.             SAY CR
  2379.             IF WORDS(finfo)<8 THEN ftemp=plaindir'/'ftemp
  2380.             SAY '***'pen3 ftemp def'is not currently available online.'CR
  2381.             SAY ' Would you like me to notify the sysop'CR
  2382.             SAY ' that you''d like to receive this file?'CR
  2383.             IF getinput(1 1 ' (Ny) > ')='Y' THEN
  2384.               DO
  2385.                 enum=countcheck('Numbers/LastMail' 0)+1
  2386.                 CALL countcheck('Numbers/LastMail' enum)
  2387.                 IF writeopen(bbspath'email/'sysop'/'name'.'enum)=0 THEN RETURN
  2388.                 CALL WRITELN(f,' Mail: 'enum )
  2389.                 CALL WRITELN(f,' From: 'name)
  2390.                 CALL WRITELN(f,'   To: 'sysop)
  2391.                 CALL WRITELN(f,' Subj: File Request')
  2392.                 CALL WRITELN(f,' Date: 'DATE()'  'TIME('C'))
  2393.                 x=RIGHT('File Request==',76,'=')
  2394.                 CALL WRITELN(f,x)
  2395.                 CALL WRITELN(f,' Mr. Sysop, I would like to have this file : ')
  2396.                 CALL WRITELN(f,' 'ftemp)
  2397.                 CALL WRITELN(f,' ')
  2398.                 CALL CLOSE(f)
  2399.                 SAY CR
  2400.                 ADDRESS AREXX bbsSpeak.rexx 'FILE_REQUEST' name bbspath saypath
  2401.                 SAY 'Your file request has been sent!'CR
  2402.                 SAY 'The file should be in your Email soon.'CR
  2403.               END
  2404.             SAY CR
  2405.           END
  2406.         RETURN 0
  2407.       END
  2408.   END
  2409. RETURN ffile
  2410.  
  2411.  
  2412. illegal_access:
  2413. SAY CR
  2414. SAY '*** You are not authorized to access' ffile'!'CR
  2415. SAY '*** Send Email to' sysop 'to receive a higher level.'CR
  2416. SAY CR
  2417. IF DATATYPE(ffile,'W') THEN ffile=ffile WORD(files.ffile,2)
  2418. CALL send2log('Illegal Access Attempt!' ffile 'in' dirtemp)
  2419. RETURN
  2420.  
  2421.  
  2422. statuscheck:
  2423. PARSE ARG ffile
  2424. updownratio=WORD(data.17,1)
  2425. IF ~DATATYPE(updownratio,'N') THEN updownratio=100
  2426. updn=ratio()
  2427. dbytes=WORD(STATEF(ffile),2)
  2428. IF ~DATATYPE(dbytes,'W') THEN dbytes=1
  2429. IF ~DATATYPE(bps,'W') THEN bps=2400
  2430. needtime=dbytes%(bps%10)+10  /* plus 10 seconds for handshaking? */
  2431. SAY CR
  2432. SAY CR
  2433. CALL showtime()
  2434. SAY 'At least' TRUNC(needtime/60+.05,1) 'minutes needed to download' ffile 'at' bps 'baud.'CR
  2435. SAY 'After this transfer your upload:download ratio will be 1:'TRUNC((dbytes+dnbytes)/upbytes)||CR
  2436. IF level>(sysoplevel+1) THEN RETURN 0
  2437. IF (needtime+TIME('E'))>maxtime THEN
  2438.   DO
  2439.     SAY CR
  2440.     SAY 'Sorry, not enough time left in this session to download' dbytes 'bytes.'CR
  2441.     IF needtime>(WORD(data.11,1)*60) THEN
  2442.       SAY 'Leave email to the sysop to make other arrangements to receive this file.'CR
  2443.     SAY CR
  2444.     RETURN 1
  2445.   END
  2446. IF updownratio>0 & updn>updownratio THEN
  2447.   DO
  2448.     SAY CR
  2449.     line=pen3'       *** You must upload before you do any more downloading! ***'def
  2450.     SAY line||CR
  2451.     SAY '  Maintain a ratio of at least 1 byte uploaded for each' updownratio 'bytes downloaded.'CR
  2452.     IF bbsprefs.4 THEN RETURN 1
  2453.     SAY pen3'             - This requirement is temporarily suspended. -'def||CR
  2454.     SAY CR
  2455.   END
  2456. RETURN 0
  2457.  
  2458.  
  2459. ext_dload:
  2460. SAY CR
  2461. CALL checkdcd()
  2462. allargs=bbsExtDL.baud(name level TRUNC(maxtime-TIME('E')) linesperpage colorflag extdevs)
  2463. IF allargs='' | TRUNC(maxtime-TIME('E'))<30 THEN RETURN
  2464. CALL dload2()
  2465. RETURN
  2466.  
  2467.  
  2468. dload:
  2469. arg=STRIP(arg data.25)
  2470. data.25=''
  2471. curdir=PRAGMA('D')
  2472. OPTIONS PROMPT 'File numbers (and/or names): '
  2473. IF arg='' THEN PARSE PULL arg  /* no filename given */
  2474. IF arg='' THEN RETURN 0
  2475. allargs=TRANSLATE(arg,'     ',':/,;|')
  2476. tempargs=SPACE(allargs,1)
  2477. numchk=1
  2478. DO ui=1 TO WORDS(tempargs) WHILE STRIP(allargs)~=''
  2479.   arg=WORD(tempargs,ui)
  2480.   IF ~DATATYPE(arg,'W') THEN numchk=0
  2481.   wloc=WORDINDEX(allargs,FIND(allargs,arg))
  2482.   wi=0
  2483.   temp=findfiles(arg)
  2484.   IF wi=999999 THEN RETURN 0
  2485.   IF temp~=arg THEN
  2486.     DO
  2487.       allargs=DELWORD(allargs,FIND(allargs,arg),1)
  2488.       IF temp~=0 THEN allargs=INSERT(temp' ',allargs,wloc-1)
  2489.     END
  2490. END
  2491. IF numchk=0 THEN
  2492.   IF countcheck('Numbers/LastFile' 0)>500 THEN
  2493.     DO
  2494.       SAY LEFT('',20)||CR
  2495.       SAY bak2' BBBBS Tip:'def'  Next time try using fileNUMBERS instead of fileNAMES.'CR
  2496.       SAY '              The BBS is MUCH faster at locating files by number.'CR
  2497.     END
  2498.  
  2499. dload2:
  2500. curdir=PRAGMA('D')
  2501. allargs=STRIP(allargs data.25)
  2502. data.25=''
  2503. IF allargs='' THEN RETURN 0
  2504. sleepy='T'
  2505. DO WHILE sleepy='T'
  2506.   arg=''
  2507.   SAY LEFT('',20)||CR
  2508.   temp=WORD(allargs,1)
  2509.   IF DATATYPE(temp,'W') THEN temp=WORD(files.temp,2)
  2510.   test=''
  2511.   IF LENGTH(temp)>40 THEN
  2512.     DO
  2513.       test=temp
  2514.       temp=''
  2515.     END
  2516.   SAY 'Filename(s)'pen3 LEFT(temp,40) def'Protocol:'pen3 protocol||def||CR
  2517.   IF test~='' THEN SAY '           'pen3 test||def||CR
  2518.   DO di=2 TO WORDS(allargs)
  2519.     temp=WORD(allargs,di)
  2520.     IF DATATYPE(temp,'W') THEN temp=WORD(files.temp,2)
  2521.     SAY '           'pen3 temp||def||CR
  2522.   END
  2523.   pline='['pen3'A'def']uto-Logoff-after-transfer ['pen3'D'def']ownload'
  2524.   pline=pline '['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol (aDqt)'
  2525.   sleepy=getinput(1 1 pline '> ')
  2526.   IF sleepy='Q' THEN RETURN 0
  2527.   IF sleepy='A' THEN sleepy='LOGOFF'
  2528.   IF sleepy='T' THEN CALL chpro()
  2529. END
  2530. DO WHILE allargs~=''
  2531.   errorflag=0
  2532.   extdir=''
  2533.   arg=WORD(allargs,1)
  2534.   allargs=STRIP(DELWORD(allargs,1,1))
  2535.   IF DATATYPE(arg,'W') THEN
  2536.     DO
  2537.       CALL setdir(libpath||WORD(files.arg,1))
  2538.       arg=WORD(files.arg,2)
  2539.     END
  2540.   notename=bbspath'FileNotes/'plaindir'/'arg
  2541.   finfo=''
  2542.   IF ~EXISTS(arg) THEN
  2543.     DO
  2544.       finfo=STATEF(notename)
  2545.       IF WORDS(finfo)>7 THEN
  2546.         DO
  2547.           temp=plaindir
  2548.           x=lastslash(WORD(finfo,8))
  2549.           arg=WORD(x,1)
  2550.           CALL setdir(WORD(x,2))
  2551.           plaindir=temp
  2552.         END
  2553.     END
  2554.   x=lastslash(arg)
  2555.   IF WORDS(x)>1 THEN
  2556.     DO
  2557.       arg=WORD(x,1)
  2558.       extdir=WORD(x,2)
  2559.       CALL setdir(extdir)
  2560.     END
  2561.   uldlflag=1
  2562.   DO dloadloop=1
  2563.     IF statuscheck(arg) THEN
  2564.       DO
  2565.         errorflag=1
  2566.         LEAVE dloadloop
  2567.       END
  2568.     CALL postuser(5)
  2569.     CALL sound('DOWNLOAD')
  2570.     SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  2571.     CALL checktime()
  2572.     UpLoad arg
  2573.     IF RC>0 | bbsXferStats(15 arg colorflag protocol extdir) THEN
  2574.       DO
  2575.         errorflag=1
  2576.         LEAVE dloadloop
  2577.       END
  2578.     CALL bytes2user(15 WORD(STATEF(arg),2))
  2579.     IF extdir='' & POS('EMAILFILES',UPPER(PRAGMA('D')))=0 THEN
  2580.       DO dloadloop2=1 TO 1
  2581.         DO di=sysoplevel+2 TO 100
  2582.           IF UPPER(dirs.di)=UPPER(plaindir) THEN LEAVE dloadloop2
  2583.         END
  2584.         IF readlines(notename 1) THEN
  2585.           DO
  2586.             CALL send2log('Unable to increment download count for' plaindir'/'arg)
  2587.             LEAVE dloadloop2
  2588.           END
  2589.         dls=WORD(lynes.2,7)
  2590.         IF ~DATATYPE(dls,'W') THEN dls=0
  2591.         lynes.2=STRIP(DELWORD(lynes.2,7,1)) dls+1
  2592.         finfo=STATEF(notename)
  2593.         IF WORDS(finfo)>7 THEN finfo=SUBSTR(finfo,WORDINDEX(finfo,8))
  2594.         ELSE finfo=''
  2595.         CALL DELETE(notename)
  2596.         CALL savelines(notename)
  2597.         CALL DELAY(28)
  2598.         IF finfo~='' THEN ADDRESS COMMAND 'C:filenote' notename finfo
  2599.         IF WORD(data.16,1)<WORD(lynes.1,2) THEN
  2600.           DO
  2601.             lastbrowse=WORD(lynes.1,2)
  2602.             newfilesdate=DATE('S') TIME()
  2603.           END
  2604.       END
  2605.     LEAVE dloadloop
  2606.   END
  2607. END
  2608. uldlflag=0
  2609. CALL setdir(curdir)
  2610. IF errorflag THEN SAY pen3'*** Download Failed!'def||CR
  2611. IF sleepy='LOGOFF' THEN
  2612.   DO
  2613.     SAY CR
  2614.     SAY 'Logging'pen3 'OFF' def'in 10 seconds...'CR
  2615.     SAY 'Press'pen3 RETURN def'to return to'pen3 bbsname||def||CR
  2616.     SAY CR
  2617.     Timeout 10
  2618.     WAIT '?'
  2619.     t=RC
  2620.     Timeout maxidle
  2621.     IF t~=0 THEN SIGNAL LOGOUT2
  2622.   END
  2623. RETURN errorflag
  2624.  
  2625.  
  2626. lastslash:
  2627. PARSE ARG sarg 
  2628. sdir=''
  2629. slash=LASTPOS('/',sarg)
  2630. IF slash>2 THEN sdir=LEFT(sarg,slash-1)
  2631. ELSE
  2632.   DO
  2633.     slash=LASTPOS(':',sarg)
  2634.     IF slash>0 THEN sdir=LEFT(sarg,slash)
  2635.   END
  2636. IF slash>0 THEN sarg=SUBSTR(sarg,slash+1)
  2637. RETURN sarg sdir
  2638.  
  2639.  
  2640. editnote:
  2641. IF arg='' THEN
  2642.   DO
  2643.     PARSE PULL arg .
  2644.     IF arg='' THEN RETURN 0
  2645.   END
  2646. comment=''
  2647. IF ~EXISTS(arg) THEN
  2648.   DO
  2649.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  2650.     temp=''
  2651.     IF WORDS(finfo)>7 THEN comment=WORD(finfo,8)
  2652.     ELSE
  2653.       DO
  2654.         IF level<sysoplevel THEN RETURN 0
  2655.         temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  2656.       END
  2657.     IF temp='Y' THEN
  2658.       DO WHILE comment=''
  2659.         comment=getinput(0 0 'Enter linkfile using full dev:path/filename > ')
  2660.         IF comment='' THEN RETURN 0
  2661.         IF ~EXISTS(comment) THEN comment=''
  2662.       END
  2663.     ELSE IF temp='Q' THEN RETURN 0
  2664.   END
  2665. IF comment='' THEN
  2666.   DO
  2667.     arg=findfiles(arg)
  2668.     IF arg=0 THEN RETURN 0
  2669.     IF DATATYPE(arg,'W') THEN arg=WORD(files.arg,2)
  2670.   END
  2671. filedir=plaindir
  2672. CALL MAKEDIR(bbspath'FileNotes/'filedir)
  2673. IF ~EXISTS(bbspath'FileNotes/'filedir) THEN
  2674.   DO
  2675.     SAY pen3'*** Failed to open directory!' filedir||def||CR
  2676.     RETURN 0
  2677.   END
  2678. notename=bbspath'FileNotes/'filedir'/'arg
  2679. lynes.=''
  2680. filenum=countcheck('Numbers/LastFile' 0)
  2681. IF level>sysoplevel THEN firstedit=1
  2682. ELSE firstedit=5
  2683. IF EXISTS(notename) THEN
  2684.   DO
  2685.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  2686.     CALL bbsEd.rexx(firstedit notename name TRUNC(maxtime-TIME('E'))-28)
  2687.     CALL checkfilechanges()
  2688.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  2689.     RETURN 0
  2690.   END
  2691. IF comment='' THEN filedata=STATEF(libpath||filedir'/'arg)
  2692. ELSE filedata=STATEF(comment)
  2693. IF filedata='' THEN
  2694.   DO
  2695.     IF comment='' THEN line=filedir'/'arg
  2696.     ELSE line=comment
  2697.     SAY line 'does not exist!'CR
  2698.     RETURN 0
  2699.   END
  2700. bytes=WORD(filedata,2)
  2701. filenum=filenum+1
  2702. lynes.0=4
  2703. lynes.1='File: 'LEFT(filenum,5)' KeyWords:'
  2704. lynes.2='Name: 'LEFT(arg,27)' Size: 'bytes' bytes   Downloads: 0'
  2705. lynes.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'filedir
  2706. lynes.4=LEFT('',74,'=')
  2707. lynes.1=lynes.1 edkeywords(arg filedir)
  2708. diz='RAM:file_id.diz'
  2709. IF EXISTS(diz) THEN CALL readlines(diz 5)
  2710. CALL DELETE(diz)
  2711. CALL seelines(1)
  2712. edtype=''
  2713. CALL writebuffer(scratch'/NoteFile')
  2714. IF savelines(notename) THEN RETURN 0
  2715. IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  2716. CALL DELETE(libpath||filedir'/.'STRIP(LEFT(filedir,15)))
  2717. fncom='R'
  2718. DO WHILE fncom='R'
  2719.   CALL seelines(1)
  2720.   nonstop=0
  2721.   line='['pen3'E'def']dit'
  2722.   IF level>sysoplevel THEN line=line '['pen3'K'def']ill'
  2723.   line=line '['pen3'R'def']ead ['pen3'S'def']ave'
  2724.   IF level>sysoplevel THEN line=line '(ekrS) 'def
  2725.   ELSE line=line '(erS) 'def
  2726.   fncom=getinput(1 1 line)
  2727.   IF fncom='K' & level>sysoplevel THEN
  2728.     DO
  2729.       SAY 'Killing FileNote..'CR
  2730.       CALL DELETE(notename)
  2731.       RETURN 1
  2732.     END
  2733.   ELSE IF fncom='E' THEN
  2734.     DO
  2735.       IF bbsEd.rexx(firstedit notename name TRUNC(maxtime-TIME('E'))-28)>0 THEN RETURN 0
  2736.       CALL readlines(notename 1)
  2737.       CALL checkfilechanges()
  2738.       fncom='R'
  2739.     END
  2740.   ELSE IF fncom~='R' THEN
  2741.     DO
  2742.       SAY 'Adjusting filelist...'CR
  2743.       IF filenum<1 THEN filenum=1
  2744.       IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',1)
  2745.       CALL countcheck('Numbers/LastFile' filenum)
  2746.       files.0=files.0+1
  2747.       newcount=alpha.0+1
  2748.       alpha.0=newcount
  2749.       files.filenum=plaindir arg
  2750.       files.filenum.0=newcount
  2751.       libnum=finddirnum(plaindir)
  2752.       PARSE VAR lynes.1 . 'KeyWords:' keywords
  2753.       alpha.newcount=LEFT(arg,22-LENGTH(WORD(lynes.2,4)))
  2754.       alpha.newcount=alpha.newcount WORD(lynes.2,4) RIGHT(filenum,5)
  2755.       alpha.newcount=alpha.newcount RIGHT(libnum,2) LEFT(plaindir,12)
  2756.       alpha.newcount=alpha.newcount STRIP(LEFT(STRIP(keywords),32))
  2757.       IF EXISTS(bbspath'Lists/Files') THEN
  2758.         x=listOPEN(f,bbspath'Lists/Files','A')
  2759.       ELSE x=listOPEN(f,bbspath'Lists/Files','W')
  2760.       IF x=0 THEN
  2761.         DO
  2762.           SAY '*** Failed to open' bbspath'Lists/Files'CR
  2763.           savefileflag=1
  2764.           RETURN 0
  2765.         END
  2766.       CALL WRITELN(f,filenum files.filenum)
  2767.       CALL CLOSE(f)
  2768.       IF EXISTS(bbspath'Lists/Files.ALPHA') THEN
  2769.         x=listOPEN(f,bbspath'Lists/Files.ALPHA','A')
  2770.       ELSE x=listOPEN(f,bbspath'Lists/Files.ALPHA','W')
  2771.       IF x=0 THEN
  2772.         DO
  2773.           SAY '*** Failed to open' bbspath'Lists/Files.ALPHA'CR
  2774.           RETURN 0
  2775.         END
  2776.       CALL WRITELN(f,alpha.newcount)
  2777.       CALL CLOSE(f)
  2778.       IF EXISTS('c:shellsort') THEN loadalphaflag=1
  2779.       ELSE sortalphaflag=1
  2780.       CALL cleanline(1)
  2781.     END
  2782. END
  2783. RETURN 0
  2784.  
  2785.  
  2786. checkfilechanges:
  2787. x=GETCLIP('BBS_FileChange')
  2788. CALL SETCLIP('BBS_FileChange')
  2789. DO ii=1 TO WORDS(x)
  2790.   fnum=WORD(x,ii)
  2791.   keywords=GETCLIP('BBS_Keywords_'fnum)
  2792.   CALL SETCLIP('BBS_Keywords_'fnum)
  2793.   num=files.fnum.0
  2794.   alpha.num=TRIM(OVERLAY(keywords,alpha.num,47,32))
  2795.   sortalphaflag=1
  2796. END
  2797. RETURN
  2798.  
  2799.  
  2800. edkeywords:
  2801. PARSE ARG kwarg
  2802. templine=''
  2803. DO WHILE LENGTH(templine)<3
  2804.   SAY CR
  2805.   SAY pen3'Please enter a list of keywords (or a condensed description)'def||CR
  2806.   SAY pen3'to be used in the alphabetic list and by the search routine.'def||CR
  2807.   SAY '    Note that only the first 32 characters will be used.'CR
  2808.   SAY LEFT('',43)'|'LEFT('',31,'=')'|'CR
  2809.   templine=getinput(0 0 ' 'RIGHT(STRIP(RIGHT(kwarg,32)),32) pen3'KeyWords: 'def)
  2810.   templine=cleanstring('0:'templine)
  2811.   templine=STRIP(LEFT(templine,32))
  2812.   SAY CR
  2813. END
  2814. RETURN templine
  2815.  
  2816.  
  2817. loadfiles:
  2818. SAY def||CR
  2819. IF ~listOPEN(f,bbspath'Lists/Files','R') THEN RETURN
  2820. SAY 'Loading filelist...'CR
  2821. files.=''
  2822. files.0=0
  2823. DO i=1
  2824.   line=READLN(f)
  2825.   IF EOF(f) THEN BREAK
  2826.   num=WORD(line,1)
  2827.   IF DATATYPE(num,'W') THEN
  2828.     DO
  2829.       IF num<100 THEN
  2830.         IF LEFT(WORD(line,3),1)~='.' THEN
  2831.           DO
  2832.             CALL CLOSE(f)
  2833.             SAY CR
  2834.             SAY 'Your filelists need to be renumbered, running bbsUPDATE.rexx...'CR
  2835.             CALL bbsUPDATE.rexx()
  2836.             SIGNAL RESET
  2837.           END
  2838.       files.num=WORD(line,2) WORD(line,3)
  2839.     END
  2840. END
  2841. files.0=i-1
  2842. CALL CLOSE(f)
  2843. RETURN
  2844.  
  2845.  
  2846. savefilelist:
  2847. IF level=99 THEN
  2848.   IF getinput(1 1 'Update filelists now? (nY) > ')='N' THEN RETURN
  2849.  
  2850. savefilelist2:
  2851. SIGNAL OFF BREAK_E
  2852. CALL savealphalist()
  2853. filenum=countcheck('Numbers/LastFile' 0)
  2854. IF filenum<1 THEN
  2855.   DO
  2856.     IF lastfile>0 THEN filenum=lastfile+100
  2857.     ELSE RETURN
  2858.   END
  2859. xarg=bbspath'Lists/Files'
  2860. IF ~listOPEN(f,xarg,'W') THEN RETURN
  2861. SAY 'Saving filelist...'CR
  2862. savefileflag=0
  2863. DO i=1 TO filenum
  2864.   IF files.i~='' THEN CALL WRITELN(f,i files.i)
  2865. END
  2866. CALL CLOSE(f)
  2867. IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  2868. RETURN
  2869.  
  2870.  
  2871. loadalpha:
  2872. ARG alflag
  2873. SAY def||CR
  2874. IF alflag THEN CALL checkliblists()
  2875. IF liblist='' THEN alflag=0
  2876. IF loadalphaflag=1 THEN
  2877.   DO
  2878.     SAY 'Sorting using fast shellsort...'CR
  2879.     t=bbspath'Lists/Files.ALPHA'
  2880.     ADDRESS COMMAND 'c:shellsort -c' t t
  2881.   END
  2882. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','R') THEN RETURN
  2883. SAY 'Loading the alphabetical filelist...'CR
  2884. loadalphaflag=0
  2885. alpha.=''
  2886. alpha.0=0
  2887. DO i=1
  2888.   line=READLN(f)
  2889.   IF EOF(f) THEN LEAVE i
  2890.   fnum=WORD(line,3)
  2891.   IF DATATYPE(fnum,'W') THEN
  2892.     DO
  2893.       alpha.i=line
  2894.       files.fnum.0=i
  2895.       IF alflag THEN CALL updateliblists()
  2896.     END
  2897.   ELSE i=i-1
  2898. END
  2899. CALL CLOSE(f)
  2900. tf=bbspath'Lists/Files.ALPHA.add'
  2901. IF EXISTS(tf) & ~SHOW('P','BBSFILE') THEN
  2902.   IF readopen(tf) THEN
  2903.     DO
  2904.       DO i=i
  2905.         line=READLN(f)
  2906.         IF EOF(f) THEN LEAVE i
  2907.         fnum=WORD(line,3)
  2908.         IF DATATYPE(fnum,'W') THEN
  2909.           DO
  2910.             alpha.i=line
  2911.             files.fnum.0=i
  2912.           END
  2913.         ELSE i=i-1
  2914.         IF alflag THEN CALL updateliblists()
  2915.       END
  2916.       CALL CLOSE(f)
  2917.       CALL DELETE(tf)
  2918.       CALL SETCLIP('BBS_resave_local',1)
  2919.     END
  2920. alpha.0=i-1
  2921. IF alflag THEN CALL closeliblists()
  2922. DO i=1 TO 99
  2923.   IF dirs.i='' THEN ITERATE i
  2924.   dname='.'STRIP(LEFT(dirs.i,15))
  2925.   IF files.i='' THEN
  2926.     DO
  2927.       files.i=dirs.i dname
  2928.       files.0=files.0+1
  2929.     END
  2930.   sz=WORD(STATEF(libpath||dirs.i'/'dname),2)
  2931.   IF ~DATATYPE(sz,'W') THEN sz=0
  2932.   x=files.i.0
  2933.   IF ~DATATYPE(x,'W') THEN
  2934.     DO
  2935.       x=alpha.0+1
  2936.       files.i.0=x
  2937.       alpha.0=x
  2938.       CALL SETCLIP('BBS_resave',1)
  2939.       CALL DELETE(libpath||dirs.i'/'dname)
  2940.     END
  2941.   alpha.x=LEFT(dname,22-LENGTH(sz)) sz RIGHT(i,5) RIGHT(i,2)
  2942.   alpha.x=alpha.x LEFT(dirs.i,12) 'alphabetical files list CONTENTS'
  2943. END
  2944. IF GETCLIP('BBS_resave')=1 THEN
  2945.   DO
  2946.     CALL SETCLIP('BBS_resave')
  2947.     sortalphaflag=1
  2948.     CALL savefilelist2()
  2949.   END
  2950. IF alpha.0<files.0 THEN buildalpha=1
  2951. SAY CR
  2952. RETURN
  2953.  
  2954.  
  2955. savealphalist:
  2956. SIGNAL OFF BREAK_E
  2957. IF GETCLIP('BBS_localfiles')~='' THEN
  2958.   DO
  2959.     CALL SETCLIP('BBS_localfiles')
  2960.     CALL loadfiles()
  2961.     CALL loadalpha(0)
  2962.   END
  2963. CALL checkliblists()
  2964. IF sortalphaflag=1 THEN
  2965.   DO
  2966.     SAY 'Alphabetizing' alpha.0 'files...'CR
  2967.     IF alpha.0>0 THEN CALL QSORT(1,alpha.0,alpha)
  2968.     DO i=1 TO alpha.0
  2969.       fnum=WORD(alpha.i,3)
  2970.       files.fnum.0=i
  2971.     END
  2972.   END
  2973. sortalphaflag=0
  2974. IF files.100~='' THEN
  2975.   DO
  2976.     sz=WORD(STATEF(libpath||WORD(files.100,1)'/'WORD(files.100,2)),2)
  2977.     IF DATATYPE(sz,'W') THEN
  2978.       DO
  2979.         anum=files.100.0
  2980.         alpha.anum=OVERLAY(RIGHT(sz,7),alpha.anum,17,7)
  2981.       END
  2982.   END
  2983. IF files.101~='' THEN
  2984.   DO
  2985.     sz=WORD(STATEF(libpath||WORD(files.101,1)'/'WORD(files.101,2)),2)
  2986.     IF DATATYPE(sz,'W') THEN
  2987.       DO
  2988.         anum=files.101.0
  2989.         alpha.anum=OVERLAY(RIGHT(sz,7),alpha.anum,17,7)
  2990.       END
  2991.   END
  2992. IF ~listOPEN(f,bbspath'Lists/Files.ALPHA','W') THEN RETURN
  2993. SAY 'Saving alphabetical filelists...'CR
  2994. DO i=1 TO alpha.0
  2995.   ii=WORD(alpha.i,3)
  2996.   IF files.ii='' THEN alpha.i='0 0' ii '100'
  2997.   IF LEFT(alpha.i,4)='0 0 ' THEN ITERATE i
  2998.   CALL WRITELN(f,alpha.i)
  2999.   IF liblist~='' THEN CALL updateliblists()
  3000. END
  3001. CALL CLOSE(f)
  3002. CALL closeliblists()
  3003. CALL bbsALPHA.rexx(files.0 SUBSTR(extension,2) arccom)
  3004. DO i=0 TO 1
  3005.   t=GETCLIP('BBS_10'i)
  3006.   IF t='' THEN ITERATE i
  3007.   CALL SETCLIP('BBS_10'i)
  3008.   num=100+i
  3009.   files.num=TRANSLATE(t,,'/')
  3010.   files.0=files.0+1
  3011.   x=alpha.0+1
  3012.   files.num.0=x
  3013.   alpha.0=x
  3014.   sz=WORD(STATEF(libpath||t),2)
  3015.   IF ~DATATYPE(sz,'W') THEN sz=0
  3016.   dnum=finddirnum(WORD(files.num,1))
  3017.   alpha.x=LEFT(WORD(files.num,2),22-LENGTH(sz)) sz '  'num RIGHT(dnum,2)
  3018.   alpha.x=alpha.x LEFT(dirs.dnum,12)
  3019.   IF i THEN alpha.x=alpha.x 'alphabetical files list CONTENTS'
  3020.   ELSE alpha.x=alpha.x 'alphabetical by library CONTENTS'
  3021.   SAY 'Added file' num t 'to the filelists.'CR
  3022.   SAY 'Must now resort and resave.'CR
  3023.   CALL SETCLIP('BBS_resave',1)
  3024. END
  3025. RETURN
  3026.  
  3027.  
  3028. listOPEN:
  3029. PARSE ARG fh,listfile,flag
  3030. DO i=0 TO 59 WHILE OPEN(fh,listfile,flag)=0
  3031.   IF i//4=0 THEN SAY 'Waiting' (60-i)*5 'more seconds for' listfile 'to become available...'CR
  3032.   CALL DELAY(250)
  3033. END
  3034. IF i>59 THEN
  3035.   DO
  3036.     line='*** unable to access' listfile 'list.'
  3037.     SAY line||CR
  3038.     CALL send2log(line TIME())
  3039.     RETURN 0
  3040.   END
  3041. RETURN 1
  3042.  
  3043.  
  3044. checkliblists:
  3045. SAY 'Checking individual library filelists...'CR
  3046. liblist=''
  3047. lastlib=0
  3048. cnt.=0
  3049. DO i=1 TO 99
  3050.   IF dirs.i='' THEN ITERATE i
  3051.   finfo=STATEF(libpath||dirs.i'/.'STRIP(LEFT(dirs.i,15)))
  3052.   IF finfo='' THEN liblist=liblist i
  3053.   ELSE
  3054.     DO
  3055.       sz=WORD(finfo,2)
  3056.       num=files.i.0
  3057.       IF DATATYPE(num,'W') THEN
  3058.         alpha.num=OVERLAY(RIGHT(sz,7),alpha.num,17,7)
  3059.     END
  3060. END
  3061. liblist=STRIP(liblist)
  3062. DO j=1 TO WORDS(liblist)
  3063.   tt=WORD(liblist,j)
  3064.   CALL MAKEDIR(libpath||dirs.tt)
  3065.   lf1=libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15))
  3066.   flg='W'
  3067.   IF EXISTS(libpath||dirs.tt'.txt') THEN
  3068.     DO
  3069.       ADDRESS COMMAND 'COPY' libpath||dirs.tt'.txt' lf1
  3070.       flg='A'
  3071.     END
  3072.   IF listOPEN(f,lf1,flg)=0 THEN ITERATE j
  3073.   IF flg='A' THEN CALL WRITELN(f,'')
  3074.   CALL WRITELN(f,'Filename          Bytes File# Library         KeyWords')
  3075.   CALL WRITELN(f,LEFT('=',77,'='))
  3076.   CALL CLOSE(f)
  3077. END
  3078. RETURN
  3079.  
  3080.  
  3081. updateliblists:
  3082. x=FIND(liblist,WORD(alpha.i,4))
  3083. IF x=0 THEN RETURN
  3084. tt=WORD(liblist,x)
  3085. IF tt~=lastlib THEN
  3086.   DO
  3087.     CALL CLOSE(a)
  3088.     lastlib=tt
  3089.     x=OPEN(a,libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)),'A')
  3090.     IF x=0 THEN
  3091.       DO
  3092.         lastlib=0
  3093.         RETURN
  3094.       END
  3095.   END
  3096. CALL WRITELN(a,alpha.i)
  3097. cnt.tt=cnt.tt+1
  3098. RETURN
  3099.  
  3100.  
  3101. closeliblists:
  3102. CALL CLOSE(a)
  3103. DO i=1 TO WORDS(liblist)
  3104.   tt=WORD(liblist,i)
  3105.   dname='.'STRIP(LEFT(dirs.tt,15))
  3106.   SAY ' 'dname||CR
  3107.   x=OPEN(f,libpath||dirs.tt'/'dname,'A')
  3108.   IF x~=0 THEN
  3109.     DO
  3110.       CALL WRITELN(f,LEFT('-',77,'-'))
  3111.       temp='file'
  3112.       IF cnt.tt~=1 THEN temp=temp's'
  3113.       temp=cnt.tt temp'.  Last updated' DATE() 'at' TIME('C')
  3114.       temp=temp RIGHT(bbsname,76-LENGTH(temp))
  3115.       CALL WRITELN(f,temp)
  3116.       CALL CLOSE(f)
  3117.     END
  3118.   CALL MAKEDIR(bbspath'FileNotes/'dirs.tt)
  3119.   fnote=bbspath'FileNotes/'dirs.tt'/'dname
  3120.   lynes.=''
  3121.   lynes.0=5
  3122.   x=OPEN(f,fnote,'R')
  3123.   IF x=0 THEN CALL SETCLIP('BBS_resave',1)
  3124.   ELSE
  3125.     DO
  3126.       DO k=1
  3127.         line=READLN(f)
  3128.         IF EOF(f) THEN LEAVE k
  3129.         lynes.k=line
  3130.       END
  3131.       CALL CLOSE(f)
  3132.       lynes.0=k-1
  3133.     END
  3134.   finfo=STATEF(libpath||dirs.tt'/.'STRIP(LEFT(dirs.tt,15)))
  3135.   bt=WORD(finfo,2)
  3136.   dl=WORD(lynes.2,7)
  3137.   IF ~DATATYPE(dl,'W') THEN dl=0
  3138.   lynes.1='File: 'LEFT(tt,5)' KeyWords: alphabetical files list CONTENTS'
  3139.   lynes.2='Name: 'LEFT(dname,27)' Size:' bt 'bytes  Downloads:' dl
  3140.   lynes.3='From: 'LEFT('BBBBS',27)' Date: 'DATE() TIME('C')'  Lib: 'dirs.tt
  3141.   lynes.4=LEFT('',74,'=')
  3142.   IF lynes.5='' THEN
  3143.     lynes.5='Up to the minute alphabetical filelist of the' dirs.tt 'library.'
  3144.   IF writeopen(fnote) THEN
  3145.     DO
  3146.       DO k=1 TO lynes.0
  3147.         CALL WRITELN(f,lynes.k)
  3148.       END
  3149.       CALL CLOSE(f)
  3150.       SAY LEFT(' ',LENGTH(dname)+2)'1B'x'Mupdated.'CR
  3151.     END
  3152. END
  3153. liblist=''
  3154. RETURN
  3155.  
  3156.  
  3157. edituser:
  3158. SAY lm
  3159. x=bbsEditUser.rexx(TRUNC(maxtime-TIME('E'))-28 name)
  3160. CALL loaddata()
  3161. IF x=1 THEN CALL sortconferences()
  3162. RETURN
  3163.  
  3164.  
  3165. setmsgs:
  3166. IF ~DATATYPE(bbsprefs.25,'W') THEN RETURN
  3167. data.22=''
  3168. data.23=''
  3169. SAY CR
  3170. line='Setting message counters to last'
  3171. IF bbsprefs.25>1 THEN line=line bbsprefs.25 'messages'
  3172. ELSE line=line 'message'
  3173. line=line 'in each conference...'
  3174. SAY line||CR
  3175. DO i=1 TO level
  3176.   num=countcheck('Numbers/LastMessage'i 0)-bbsprefs.25
  3177.   IF num<0 | msg.i.0<bbsprefs.25 THEN num=0
  3178.   lastread.i=num
  3179.   data.22=data.22 num
  3180.   data.23=data.23 0
  3181. END
  3182. SAY 'Setting file counter to last file uploaded...'CR
  3183. lastbrowse=countcheck('Numbers/LastFile' 0)
  3184. newfilesdate=DATE('S') TIME()
  3185. RETURN
  3186.  
  3187.  
  3188. getnumber:
  3189. PARSE ARG tprompt
  3190. tnum=getinput(1 0 '  'tprompt' > ')
  3191. mask=COMPRESS(XRANGE(),'0123456789')
  3192. tnum=COMPRESS(tnum,mask)
  3193. IF ~DATATYPE(tnum,'W') THEN tnum=0
  3194. tnum=tnum%1
  3195. IF tnum>0 & tnum<10 THEN tnum='0'tnum
  3196. RETURN tnum
  3197.  
  3198.  
  3199. getbirth:
  3200. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  Birthday:'
  3201. SAY pen3'Birthday Information:'def||CR
  3202. month=getnumber('Please enter the MONTH you were born: (1-12)')
  3203. day=getnumber('Please enter the DAY   you were born: (1-31)')
  3204. year=getnumber('Please enter the YEAR  you were born:       ')
  3205. IF year<100 THEN year=year+1900
  3206. born=year||month||day
  3207. IF born<18750101 | born>(DATE('S')-50000) THEN   /* must be older than 4 */
  3208.   DO
  3209.     born=''
  3210.     IF getinput(1 1 'Would you rather skip this question? (Ny) > ')~='Y' THEN
  3211.       CALL getbirth()
  3212.   END
  3213. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  'WORD(data.12,3)' 'WORD(born,1)
  3214. RETURN
  3215.  
  3216.  
  3217. getname:
  3218. nonstop=0
  3219. CALL showuserlist()
  3220. SAY CR
  3221. waitchar='Q'
  3222. CALL showtext(bbspath'BBS_TEXT/NEW_USER_NAME' 1)
  3223. pline='Your name on'pen3 bbsname def'will be > '
  3224. name=getinput(1 0 pline)
  3225. name=cleanstring(1':'name)
  3226. IF name='' THEN
  3227.   DO
  3228.     name=getinput(1 0 pline)
  3229.     name=cleanstring(1':'name)
  3230.     IF name='' THEN
  3231.       DO
  3232.         SAY 'No name, no entry.  Bye!'CR
  3233.         SIGNAL DONE
  3234.       END
  3235.   END
  3236. IF EXISTS(bbspath'Users/'name) | FIND(exclusion,name)>0 THEN
  3237.   DO
  3238.     SAY 'Sorry! That name is taken. Please try again.'CR
  3239.     RETURN 1
  3240.   END
  3241. IF LENGTH(name)=1 THEN
  3242.   DO
  3243.     SAY 'One letter names are not allowed,' name', please try again.'CR
  3244.     RETURN 1
  3245.   END
  3246. IF getinput(1 1 'Your name on'pen3 bbsname def'will be >' name', is that correct? (nY) > ')='N' THEN
  3247.   RETURN 1
  3248. RETURN 0
  3249.  
  3250.  
  3251. /** see if name is in data */
  3252.  
  3253. checkUser:
  3254. tries=0
  3255. IF name='NEW' THEN
  3256.   DO
  3257.     name=''
  3258.     DO WHILE getname()
  3259.     END
  3260.     CALL postuser(7)
  3261.   END
  3262. IF ~EXISTS(bbspath'Users/'name) THEN
  3263.   DO
  3264.     IF EXISTS(bbspath'BBS_TEXT/NEW') THEN
  3265.       DO
  3266.         nonstop=0
  3267.         CALL showtext(bbspath'BBS_TEXT/NEW' 1)
  3268.       END
  3269.     SAY CR
  3270.     IF getinput(1 1 'Do you want to register? (nY) > ')='N' THEN
  3271.       DO
  3272.         SAY 'Thanks anyway, bye!'CR
  3273.         line=name 'did not want to register.'
  3274.         SIGNAL OUT2
  3275.       END
  3276.     defile=bbspath'BBS_TEXT/DEF.NEW_USER'
  3277.     CALL loadcourtesy()
  3278.     wordnum=FIND(courtesy,name)
  3279.     IF wordnum>0 THEN
  3280.       DO
  3281.         SAY name', is on the Courtesy List. You will be granted immediate access.'CR
  3282.         courtesy=STRIP(DELWORD(courtesy,wordnum,1))
  3283.         IF writeopen(bbspath'Lists/Courtesy') THEN
  3284.           DO
  3285.             DO i=1 TO WORDS(courtesy)
  3286.               CALL WRITELN(f,WORD(courtesy,i))
  3287.             END
  3288.             CALL CLOSE(f)
  3289.           END
  3290.         defile=bbspath'BBS_TEXT/DEF.COURTESY'
  3291.       END
  3292.     ELSE IF bbsprefs.7=0 THEN SAY name', You have new user access.'CR
  3293.     IF readlines(defile 1) THEN SIGNAL DONE
  3294.     CALL sound('NEW_USER')
  3295.     data.=''
  3296.     data.0=27
  3297.     DO i=6 TO 22
  3298.       data.i=lynes.i
  3299.     END
  3300.     data.12=DATE('S')'  'TIME('C')
  3301.     data.13=data.12
  3302.     lastondate=DATE('I')-1
  3303.     lastontime=TIME('C')
  3304.     x=FIND(UPPER(data.8),'COLOR')
  3305.     test=getinput(1 1 'Do you see colors ('pen3'ANSI' pen2'C'pen3'O'pen5'L'pen6'O'pen7'R' pen3'codes'def') on this line? (nY) > ')
  3306.     IF test='N' THEN
  3307.       DO
  3308.         IF x>0 THEN data.8=DELWORD(data.8,x,1)
  3309.         CALL colors(0)
  3310.       END
  3311.     ELSE IF x=0 THEN
  3312.       DO
  3313.         data.8=data.8 'COLOR'
  3314.         CALL colors(1)
  3315.       END
  3316.     DO i=60 TO 0 BY -1
  3317.       SAY RIGHT('- 'i' -',14)||CR
  3318.     END
  3319.     data.7=getinput(1 0 'What number is now at the top of your screen? > ')
  3320.     IF data.7<17 | data.7>75 THEN data.7=20
  3321.     SAY 'Please enter the password you would like to use here.'CR
  3322.     data.5=getinput(1 0 'Enter Password: ')
  3323.     DO WHILE getinput(1 1 'Your password on' bbsname 'will be :' data.5 ', is that correct? (nY) > ')='N'
  3324.       data.5=getinput(1 0 'Enter Password: ')
  3325.     END
  3326.     IF data.5='' THEN
  3327.       DO
  3328.         line=name 'refused to enter a password.'
  3329.         SIGNAL DONE
  3330.       END
  3331.     data.1=''
  3332.     DO WHILE data.1=''
  3333.       data.1=getinput(0 0 'Full (real) Name: ')
  3334.       IF data.1='' THEN SAY 'You MUST leave your real name!'CR
  3335.     END
  3336.     data.2=getinput(0 0 'Street: ')
  3337.     data.3=getinput(0 0 'City, State Zip: ')
  3338.     data.4=''
  3339.     DO WHILE data.4=''
  3340.       data.4=getinput(0 0 'Voice Phone (including areacode): ')
  3341.       IF data.4='' THEN
  3342.         SAY sysop 'MUST be able to reach you by phone to validate you!'CR
  3343.     END
  3344.     CALL getbirth()
  3345.     IF bbsprefs.8 THEN
  3346.       DO
  3347.         newufile=bbspath'Lists/NEW_USERS'
  3348.         IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  3349.         ELSE
  3350.           DO
  3351.             ok=OPEN(f,newufile,'W')
  3352.             IF ok~=0 THEN CALL WRITELN(f,'*** New Users ***')
  3353.           END
  3354.         IF ok~=0 THEN
  3355.           DO
  3356.             temp=RIGHT(TIME('C'),7) COMPRESS(DATE())
  3357.             temp=temp LEFT(name,24)'=' data.1'  'data.4
  3358.             CALL WRITELN(f,temp) 
  3359.           END
  3360.         CALL CLOSE(f)
  3361.       END
  3362.     data.9=getinput(0 0 'Computer: ')
  3363.     data.10=getinput(0 0 'Interests: ')
  3364.     test=getinput(1 1 pen3'Do you want other users to see your STREET address? (Ny) > 'def)
  3365.     IF test='Y' THEN data.8=data.8 'STREET'
  3366.     test=getinput(1 1 pen3'Do you want other users to see your PHONE number? (Ny) > 'def)
  3367.     IF test='Y' THEN data.8=data.8 'PHONE'
  3368.     IF bbsprefs.7>0 THEN
  3369.       DO
  3370.         data.20=bbsprefs.7
  3371.         CALL do_eleven(60 bbsprefs.16 bbsprefs.16-1)
  3372.       END
  3373.     SAY CR
  3374.     CALL setdata()
  3375.     IF data.20=0 THEN
  3376.       SAY 'Thank you, the sysop will give you higher access soon.'CR
  3377.     ELSE CALL setmsgs()
  3378.     SAY CR
  3379.     SAY 'Please feel free to leave additional info by using [C]omment.'CR
  3380.     SAY CR
  3381.     CALL savedata(1)
  3382.     SAY 'Adding' name 'to the user list...'CR
  3383.     newpassword=data.5
  3384.     sortuserflag=1
  3385.     temp=countcheck('Numbers/Users' 0)+1
  3386.     CALL countcheck('Numbers/Users' temp)
  3387.   END
  3388. ELSE
  3389.   DO
  3390.     IF loaddata()=0 THEN SIGNAL DONE
  3391.     city=docity(data.3)
  3392.     PARSE VAR data.11 amins . . . ttimes . . . atimes .
  3393.     lastondate=DATE('I',WORD(data.13,1),'S')
  3394.     lastontime=WORD(data.13,2)
  3395.     IF DATE('I')>lastondate | level>=sysoplevel THEN atimes=ttimes
  3396.     IF level=99 & amins<120 THEN amins=120
  3397.     data.13=DATE('S')'  'TIME()
  3398.     CALL do_eleven(amins ttimes atimes-1)
  3399.     IF atimes<1 & DATE('I')=lastondate THEN
  3400.       DO
  3401.         SAY CR
  3402.         SAY CR
  3403.         line= 'Too many calls today.   Call tomorrow.'
  3404.         SAY line||CR
  3405.         SAY CR
  3406.         SAY CR
  3407.         CALL send2log(line)
  3408.         IF atimes<(-1) THEN SIGNAL LOGOUT2
  3409.         ELSE SIGNAL LOGOUT
  3410.       END
  3411.     data.13=DATE('S')'  'TIME('C')
  3412.     SAY CR
  3413.     SAY pen3'Password will'def 'NOT' pen3'be echoed.'def||CR
  3414.     SAY CR
  3415.     passprompt='Enter Password: '
  3416.     DO tries=1 TO 3
  3417.       Send passprompt
  3418.       Remote OFF
  3419.       OPTIONS PROMPT ''
  3420.       newpassword=getinput(1 0 '')
  3421.       Remote ON
  3422.       IF(password=newpassword) THEN
  3423.         DO
  3424.           SAY ''CR
  3425.           LEAVE tries; /* correct password */
  3426.         END
  3427.       IF tries=3 THEN
  3428.         DO             /* 3 tries, hang up */
  3429.           SAY ''CR
  3430.           SAY 'Access terminated.'CR
  3431.           line='*** Bad password ***' newpassword '***'
  3432.           SAY line||CR
  3433.           city=line
  3434.           CALL postuser(6)
  3435.           SIGNAL OUT2
  3436.         END
  3437.       SAY ''lineup'                                 'CR
  3438.       passprompt='Incorrect.  Password: ' /* ask again */
  3439.     END
  3440.   END
  3441. SAY CR
  3442. IF bbsprefs.23=1 THEN
  3443.   ADDRESS AREXX bbsSpeak.rexx 'LOGON' name bbspath saypath
  3444. RETURN
  3445.  
  3446.  
  3447. do_eleven:
  3448. ARG am tc at .
  3449. data.11=am 'minutes per call,' tc 'calls per day,'
  3450. data.11=data.11 at 'more calls today'
  3451. RETURN
  3452.  
  3453.  
  3454. savedata:
  3455. ARG messflag .
  3456. IF data.5='' THEN RETURN
  3457. temp=GETCLIP(name'_UPDATE')
  3458. IF temp~='' THEN
  3459.   DO
  3460.     CALL SETCLIP(name'_UPDATE')
  3461.     PARSE VAR temp upfiles' 'upbytes' 'upmail' 'upmsg
  3462.     IF upfiles>0 THEN
  3463.       DO
  3464.         files=WORD(data.14,1)
  3465.         bytes=WORD(data.14,3)
  3466.         IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  3467.         IF DATATYPE(bytes,'W') THEN bytes=upbytes
  3468.         data.14=upfiles 'files' bytes 'bytes.' DATE()
  3469.       END
  3470.     IF upmail>0 THEN
  3471.       DO
  3472.         mail=WORD(data.17,2)
  3473.         IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  3474.         data.17=WORD(data.17,1) upmail WORD(data.17,3)
  3475.       END
  3476.     IF upmsg~='' THEN
  3477.       DO
  3478.         temp=data.23
  3479.         DO i=1 TO level
  3480.           smsg=WORD(temp,i)
  3481.           IF ~DATATYPE(smsg,'W') THEN smsg=0
  3482.           IF FIND(upmsg,i) THEN smsg=smsg+1
  3483.           data.23=data.23 smsg
  3484.         END
  3485.       END
  3486.   END
  3487. SAY 'Updating...             'lineup||CR
  3488. SIGNAL OFF BREAK_E
  3489. Status Trans
  3490. data.6=STRIP(RESULT)
  3491. IF newfilesdate~='' THEN data.16=lastbrowse newfilesdate
  3492. ELSE IF lastbrowse>0 THEN
  3493.   DO
  3494.     IF WORDS(data.16)>1 THEN data.16=DELWORD(data.16,1,1)
  3495.     ELSE data.16=DATE('S') TIME()
  3496.     data.16=lastbrowse data.16
  3497.   END
  3498. IF DATATYPE(winnings,'N') THEN data.18=winnings
  3499. ELSE data.18=0
  3500. IF messflag THEN
  3501.   DO
  3502.     userexclude.=0
  3503.     DO si=1 TO WORDS(data.22)
  3504.       IF WORD(data.22,si)=-1 THEN userexclude.si=1
  3505.     END
  3506.     data.22=''
  3507.     data.23=''
  3508.     DO si=1 TO level
  3509.       IF ~DATATYPE(lastread.si,'W') THEN lastread.si=0
  3510.       IF userexclude.si THEN data.22=data.22 '-1'
  3511.       ELSE data.22=data.22 lastread.si
  3512.       IF ~DATATYPE(totwrit.si,'W') THEN totwrit.si=0
  3513.       data.23=data.23 totwrit.si
  3514.     END
  3515.   END
  3516. IF writeopen(bbspath'USERS/'name)=0 THEN RETURN
  3517. IF data.0<27 THEN data.0=27
  3518. DO i=1 TO data.0
  3519.   CALL WRITELN(f,data.i)
  3520. END
  3521. CALL CLOSE(f)
  3522. SAY 'User' name 'has been updated.'CR
  3523. RETURN
  3524.  
  3525.  
  3526. loaddata:
  3527. IF name='' THEN RETURN 0
  3528. IF ~readopen(bbspath'USERS/'name) THEN RETURN 0
  3529. data.=''
  3530. DO i=1
  3531.   line=READLN(f)
  3532.   IF EOF(f) THEN BREAK
  3533.   data.i=line
  3534. END
  3535. data.0=i-1
  3536. CALL CLOSE(f)
  3537. winnings=WORD(data.18,1)
  3538. IF ~DATATYPE(winnings,'N') THEN winnings=0
  3539.  
  3540. setdata:
  3541. IF WORDS(data.16)<3 THEN data.16='0 19900101 00:00:00'
  3542. lastbrowse=WORD(data.16,1)
  3543. IF ~DATATYPE(lastbrowse,'W') THEN lastbrowse=0
  3544. level=data.20
  3545. DO i=1 TO level
  3546.   lastread.i=WORD(data.22,i)
  3547.   IF ~DATATYPE(lastread.i,'W') THEN lastread.i=0
  3548.   totwrit.i=WORD(data.23,i)
  3549.   IF ~DATATYPE(totwrit.i,'W') THEN totwrit.i=0
  3550. END
  3551. password=data.5
  3552. IF data.6='' THEN
  3553.   DO
  3554.     Status Trans
  3555.     data.6=RESULT
  3556.   END
  3557. ELSE
  3558.   DO
  3559.     IF RIGHT(UPPER(data.6),2)='-G' THEN data.6='G'
  3560.     IF RIGHT(UPPER(data.6),3)='-1K' THEN data.6='K'
  3561.     IF LEFT(UPPER(data.6),1)='A' THEN data.6='Z'
  3562.     Set UPPER(LEFT(data.6,1))
  3563.   END
  3564. IF ~DATATYPE(data.7,'W') THEN data.7=20
  3565. IF data.7<5 THEN data.7=5
  3566. linesperpage=data.7
  3567. IF FIND(UPPER(data.8),'TERSE')>0 THEN terseflag=1
  3568. ELSE terseflag=0
  3569. IF FIND(UPPER(data.8),'COLOR')>0 THEN colorflag=1
  3570. ELSE colorflag=0
  3571. CALL colors(colorflag)
  3572. IF FIND(UPPER(data.8),'CLEAR')>0 THEN clr='0C'x
  3573. ELSE clr=''
  3574. menu='ALL'
  3575. IF FIND(UPPER(data.8),'MENUS')>0 THEN
  3576.   DO
  3577.     menuflag=1
  3578.     menu='MAIN'
  3579.   END
  3580. ELSE IF FIND(UPPER(data.8),'MENU')>0 THEN menuflag=1
  3581. ELSE menuflag=0
  3582. IF level=0 THEN menu='NEW'
  3583. IF DATATYPE(WORD(data.11,3),'W') THEN
  3584.   DO
  3585.     PARSE VAR data.11 amins . atimes .
  3586.     CALL do_eleven(amins bbsprefs.16 atimes)
  3587.   END
  3588. data.21=UPPER(data.21)
  3589. maxtime=WORD(data.11,1)*60+addtime
  3590. CALL MAKEDIR(bbspath'Friends')
  3591. alias.=''
  3592. alias.0=0
  3593. realname.=''
  3594. CALL CLOSE(f)
  3595. IF OPEN(f,bbspath'Friends/'name,'R')=0 THEN RETURN 1
  3596. DO i=1
  3597.   line=READLN(f)
  3598.   IF EOF(f) THEN LEAVE i
  3599.   alias.i=WORD(line,1)
  3600.   realname.i=WORD(line,2)
  3601. END
  3602. alias.0=i-1
  3603. CALL CLOSE(f)
  3604. RETURN 1
  3605.  
  3606.  
  3607. switchmenuflag:
  3608. IF menuflag=1 THEN
  3609.   DO
  3610.     menuflag=0
  3611.     noff='OFF'
  3612.   END
  3613. ELSE
  3614.   DO
  3615.     menuflag=1
  3616.     noff='ON'
  3617.   END
  3618. SAY 'Menus turned' pen3||noff||def'.'CR
  3619. SAY 'To make a permanent change, add or delete MENU(S) from [Y]our userdata item 8.'CR
  3620. RETURN
  3621.  
  3622.  
  3623. switchcolors:
  3624. IF colorflag=1 THEN
  3625.   DO
  3626.     colorflag=0
  3627.     noff='OFF'
  3628.   END
  3629. ELSE
  3630.   DO
  3631.     colorflag=1
  3632.     noff='ON'
  3633.   END
  3634. CALL colors(colorflag)
  3635. SAY 'Color turned' pen3||noff||def'.'CR
  3636. SAY 'To make a permanent change, add or delete COLOR from [Y]our userdata item 8.'CR
  3637. RETURN
  3638.  
  3639.  
  3640. /* ANSI pen color codes */
  3641. colors:
  3642. ARG onoff
  3643. IF onoff THEN
  3644.   DO
  3645.     def='';  /* default */
  3646.     pen0='';  pen1='';  pen2='';  pen3=''
  3647.     pen4='';  pen5='';  pen6='';  pen7=''
  3648.     bak0='';  bak1='';  bak2='';  bak3=''
  3649.     bak4='';  bak5='';  bak6='';  bak7=''
  3650.   END
  3651. ELSE
  3652.   DO
  3653.     pen0=''; pen1=''; pen2=''; pen3=''; pen4=''; pen5=''; pen6=''; pen7=''
  3654.     bak0=''; bak1=''; bak2=''; bak3=''; bak4=''; bak5=''; bak6=''; bak7=''
  3655.     def=''
  3656.   END
  3657. RETURN
  3658.  
  3659.  
  3660. chpro:
  3661. arg=UPPER(LEFT(arg,1))
  3662. IF(arg='') THEN
  3663.   DO
  3664.     SAY CR
  3665.     SAY '['pen3'W'def']- WXModem'CR
  3666.     SAY '['pen3'X'def']- XModem-CRC'CR
  3667.     SAY '['pen3'K'def']- XModem-1K'CR
  3668.     SAY '['pen3'Y'def']- YModem'CR
  3669.     SAY '['pen3'G'def']- YModem-G'CR
  3670.     SAY '['pen3'Z'def']- ZModem'CR
  3671.     SAY CR
  3672.     arg=getinput(1 0 STRIP(protocol) '> ')
  3673.  END
  3674. IF LEFT(UPPER(arg),1)='A' THEN arg='Z'
  3675. Set arg
  3676. Status Transfer
  3677. protocol=STRIP(RESULT)
  3678. SAY protocol||CR
  3679. RETURN
  3680.  
  3681.  
  3682. sortinfofiles:
  3683. infolist=SHOWDIR(bbspath'Information')
  3684. IF infolist='' THEN
  3685.   DO
  3686.     SAY CR
  3687.     SAY pen3'No files are currently in the Information drawer.'def||CR
  3688.     SAY CR
  3689.     RETURN 1
  3690.   END
  3691. IF ~DATATYPE(sortinfo.0,'W') THEN
  3692.   DO
  3693.     info.=''
  3694.     sortinfo.=''
  3695.     info.0=WORDS(infolist)
  3696.     DO i=1 TO info.0
  3697.       info.i=WORD(infolist,i)
  3698.     END
  3699.     SAY 'Sorting..'CR
  3700.     IF info.0>0 THEN CALL QSORT(1,info.0,info)
  3701.     sortinfo.0=info.0%3
  3702.     IF (info.0//3)>0 THEN sortinfo.0=sortinfo.0+1
  3703.     DO i=1 TO sortinfo.0
  3704.       sortinfo.i=''
  3705.       DO j=0 TO 2
  3706.         k=i+j*sortinfo.0
  3707.         IF k<=info.0 THEN
  3708.           DO
  3709.             sortinfo.i=sortinfo.i RIGHT(k,3)'.' LEFT(info.k,19)
  3710.             infocount=WORD(STATEF(bbspath'Information/'info.k),8)
  3711.             sortinfo.i.0=sortinfo.i.0||RIGHT(infocount,5) LEFT(info.k,19)
  3712.           END
  3713.       END
  3714.     END
  3715.     SAY lineup'         'lineup||CR
  3716.   END
  3717. RETURN 0
  3718.  
  3719.  
  3720. information:
  3721. IF sortinfofiles() THEN RETURN
  3722. CALL sound('INFO')
  3723. num=1
  3724. readcount=-1
  3725. DO infoloop=1
  3726.   CALL postfour('   Information: Menu')
  3727.   IF num=0 THEN
  3728.     DO
  3729.       IF readcount~=-1 THEN
  3730.         DO
  3731.           sortinfo.0=''
  3732.           IF sortinfofiles() THEN RETURN
  3733.         END
  3734.       SAY CENTER('- Number of accesses per file -',75)||CR
  3735.     END
  3736.   ELSE SAY pen3'These text files are available for reading online...'def||CR
  3737.   SAY pen3||LEFT('-',75,'-')||def||CR
  3738.   DO i=1 TO sortinfo.0
  3739.     IF num=0 THEN SAY sortinfo.i.0||CR
  3740.     ELSE SAY sortinfo.i||CR
  3741.   END
  3742.   SAY pen3||LEFT('-',75,'-')||def||CR
  3743.   CALL checktime()
  3744.   IF num=0 THEN
  3745.     DO
  3746.       CALL waiting()
  3747.       num=1
  3748.       ITERATE infoloop
  3749.     END
  3750.   num=getinput(1 0 pen3'Select Number Of Information File To View. 0=Stats > 'def)
  3751.   IF num=0 THEN ITERATE infoloop
  3752.   IF ~DATATYPE(num,'W') | num<1 | num>info.0 THEN RETURN
  3753.   readcount=STATEF(bbspath'Information/'info.num)
  3754.   readbytes=WORD(readcount,2)
  3755.   SAY '  'info.num 'is' readbytes 'bytes.'CR
  3756.   CALL postfour('Information:' info.num)
  3757.   IF getinput(1 1 '['pen3'R'def']ead or ['pen3'D'def']ownload? (dR) > ')='D' THEN
  3758.     DO
  3759.       allargs=bbspath'Information/'info.num
  3760.       CALL dload2()
  3761.     END
  3762.   ELSE
  3763.     DO
  3764.       SAY 'Loading File...'CR
  3765.       CALL Increment.rexx(bbspath'Information/'info.num)
  3766.       CALL DELAY(28)
  3767.       CALL readlines(bbspath'Information/'info.num 1)
  3768.       CALL cleanline(0)
  3769.       SAY lineup'    'lynes.0 'lines.'CR
  3770.       SAY CR    
  3771.       CALL seelines(0)
  3772.     END
  3773.   CALL showtime()
  3774.   IF waitchar~='Q' THEN CALL waiting()
  3775.   nonstop=0
  3776. END
  3777. RETURN
  3778.  
  3779.  
  3780. newfiles:
  3781. SAY CR
  3782. test=getinput(1 1 'Show one library only? (Ny) > ')
  3783. IF test='Y' THEN
  3784.   IF chdir()>0 THEN RETURN
  3785. SAY 'Searching for new (un-browsed) files since' DATE(,WORD(data.16,2),'S') 'at' WORD(data.16,3)'...'CR
  3786. lastbrowz=WORD(data.16,1)
  3787. lastfile=countcheck('Numbers/LastFile' 0)
  3788.  
  3789. newfiles2:
  3790. IF lastbrowz>=lastfile THEN
  3791.   DO
  3792.     lastbrowz=0
  3793.     SAY pen3'No new files. Listing backwards by date from last file uploaded...'def||CR
  3794.   END
  3795. ELSE newfilesflag=1
  3796. j=0
  3797. IF test='Y' THEN
  3798.   DO
  3799.     filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))-1
  3800.     CALL busywait(4 1)
  3801.   END
  3802. DO ni=lastfile TO lastbrowz+1 BY -1
  3803.   IF files.ni~='' THEN
  3804.     DO
  3805.       IF test='Y' THEN 
  3806.         DO
  3807.           IF ni>1 THEN CALL busywait(60 ni lastfile-lastbrowz)
  3808.           IF j>=filecount THEN LEAVE ni
  3809.           IF UPPER(LEFT(WORD(files.ni,1),12))~=UPPER(LEFT(plaindir,12)) THEN
  3810.             ITERATE ni
  3811.         END
  3812.       jj=files.ni.0
  3813.       IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(WORD(files.ni,1)))>0 THEN
  3814.         ITERATE ni  /* unauthorized */
  3815.       IF test='Y' THEN CALL busywait(4 0)
  3816.       j=j+1
  3817.       IF j=1 THEN CALL fileheader()
  3818.       SAY alpha.jj||CR
  3819.       IF (j+2)//(linesperpage-1)=0 THEN
  3820.         IF waiting2() THEN LEAVE ni
  3821.       IF test='Y' THEN CALL busywait(4 1)
  3822.     END
  3823. END
  3824. IF test='Y' THEN CALL busywait(4 0)
  3825. IF j//linesperpage~=0 THEN CALL waiting()
  3826. IF j=0 & newfilesflag=1 THEN
  3827.   DO
  3828.     lastbrowz=999999
  3829.     newfilesflag=0
  3830.     CALL newfiles2()
  3831.   END
  3832. IF test~='Y' THEN
  3833.   DO
  3834.     CALL newinfo()
  3835.     IF lynes.0>0 THEN CALL waiting()
  3836.   END
  3837. nonstop=0
  3838. RETURN
  3839.  
  3840.  
  3841. newinfo:
  3842. lynes.=''
  3843. lynes.0=0
  3844. dm=DATE(,WORD(data.16,2),'S')
  3845. PARSE VAR dm da' 'mo' 'yr .
  3846. yr=RIGHT(yr,2)
  3847. sincedate=da'-'mo'-'yr
  3848. startline=1
  3849. arg=bbspath'Information'
  3850. IF WORD(STATEF(arg),5)>lastondate THEN
  3851.   DO
  3852.     ADDRESS COMMAND 'C:LIST >'scratch'/dirlist' arg 'NOHEAD DATES SINCE' sincedate
  3853.     IF WORD(STATEF(scratch'/dirlist'),2)>3 THEN
  3854.       DO
  3855.         lynes.startline=pen1||bak2' New or Updated Information Files. Enter'def pen3'I'def bak2'from the main menu to read 'def
  3856.         CALL readlines(scratch'/dirlist' startline+1)
  3857.       END
  3858.   END
  3859. arg=bbspath'Profiles'
  3860. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  3861.   DO
  3862.     ADDRESS COMMAND 'C:LIST >'scratch'/dirlist' arg 'NOHEAD DATES SINCE' sincedate
  3863.     IF WORD(STATEF(scratch'/dirlist'),2)>3 THEN
  3864.       DO
  3865.         startline=lynes.0+2
  3866.         lynes.startline=pen1||bak2' New or Updated User Profiles. Enter'def pen3'&'def bak2'from the main menu to read 'def
  3867.         CALL readlines(scratch'/dirlist' startline+1)
  3868.       END
  3869.   END
  3870. arg=bbspath'rexxDoors/Data/Polls'
  3871. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  3872.   DO
  3873.     startline=lynes.0+2
  3874.     lynes.startline=pen1||bak2' Voting Activity. Enter'def pen3'J'def bak2'from the main menu, then select Polling_Place 'def
  3875.     lynes.0=startline
  3876.   END
  3877. IF logonflag=1 THEN nonstop=1
  3878. IF lynes.0>0 THEN CALL seelines(1)
  3879. nonstop=0
  3880. RETURN
  3881.  
  3882.  
  3883. chdir:
  3884. string=''
  3885. SAY pen3||LEFT('-',75,'-')||def||CR
  3886. DO i=1 TO libs.0
  3887.   SAY libs.i||CR
  3888. END
  3889. SAY pen3||LEFT('-',75,'-')||def||CR
  3890. dirnum=getinput(1 0 pen3'Select Library Number: 'def)
  3891. IF clr~='' THEN Send clr
  3892. IF ~DATATYPE(dirnum,'W') THEN
  3893.   DO
  3894.     waitchar=dirnum
  3895.     RETURN 2
  3896.   END
  3897.  
  3898. chdir2:
  3899. IF dirnum<1 | dirnum>99 THEN
  3900.   DO
  3901.     waitchar=dirnum
  3902.     RETURN 1
  3903.   END
  3904. IF dirs.dirnum='' THEN
  3905.   DO
  3906.     SAY pen3'That library number is currently un-assigned.'def||CR
  3907.     RETURN 1
  3908.   END
  3909. IF dirnum>level | FIND(data.21,UPPER(dirs.dirnum))>0 THEN
  3910.   DO
  3911.     SAY pen3'You do not have authorization for that library!'def||CR
  3912.     RETURN 1
  3913.   END
  3914. td=libpath||dirs.dirnum
  3915. CALL MAKEDIR(td)
  3916. CALL setdir(td)
  3917. IF libtext=0 THEN
  3918.   IF EXISTS(td'/.'STRIP(LEFT(dirs.dirnum,15))) THEN RETURN 0
  3919. t=libpath||plaindir'.txt'
  3920. IF terseflag | ~EXISTS(t) THEN RETURN 0
  3921. nonstop=1
  3922. SAY CR
  3923. CALL readlines(t 1)
  3924. CALL seelines(1)
  3925. SAY CR
  3926. nonstop=0
  3927. RETURN 0
  3928.  
  3929.  
  3930. since:
  3931. dm=DATE(,WORD(data.16,2),'S')
  3932. SAY CR
  3933. SAY 'New files or files moved since' dm||CR
  3934. CALL listsince()
  3935. CALL readlines(scratch'/dirlist' 1)
  3936. CALL seelines(1)
  3937. nonstop=0
  3938. CALL waiting()
  3939. RETURN
  3940.  
  3941.  
  3942. listsince:
  3943. dm=DATE(,WORD(data.16,2),'S')
  3944. PARSE VAR dm da' 'mo' 'yr .
  3945. yr=RIGHT(yr,2)
  3946. sincedate=da'-'mo'-'yr
  3947. ADDRESS COMMAND 'C:list >'scratch'/dirlist' directory 'DATES SINCE' sincedate
  3948. RETURN
  3949.  
  3950.  
  3951. list:
  3952. onetime=0
  3953. IF DATATYPE(arg,'W') THEN onetime=1
  3954. ELSE arg=''
  3955. DO listloop=1
  3956.   IF DATATYPE(arg,'W') THEN
  3957.     DO
  3958.       dirnum=arg
  3959.       arg=''
  3960.       IF chdir2()>0 THEN RETURN
  3961.       CALL listsimple()
  3962.       IF waitchar='Q' | onetime THEN LEAVE listloop
  3963.     END
  3964.   ELSE IF arg='' THEN
  3965.     DO
  3966.       libtext=0
  3967.       IF chdir()>0 THEN
  3968.         DO
  3969.           libtext=1
  3970.           RETURN
  3971.         END
  3972.       test='Y'
  3973.       CALL showalpha2()
  3974.       arg=''
  3975.       IF waitchar='Q' THEN waitchar=''
  3976.       IF waitchar~='' THEN RETURN
  3977.       ITERATE listloop
  3978.     END
  3979.   ELSE RETURN
  3980. END
  3981. RETURN
  3982.  
  3983.  
  3984. listsimple:
  3985. ADDRESS COMMAND 'C:list >'scratch'/dirlist' directory 'DATES'
  3986. IF readlines(scratch'/dirlist' 1) THEN RETURN
  3987. IF lynes.0>3 THEN
  3988.   DO
  3989.     SAY pen3'Sorting...'def||lineup||CR
  3990.     linesave=lynes.1  /* these 4 lines put in to leave dir title at top */
  3991.     lynes.1='0'
  3992.     IF lynes.0>1 THEN CALL QSORT(1,lynes.0-1,lynes)
  3993.     CALL DELAY(14)
  3994.     lynes.1=linesave
  3995.   END
  3996. CALL seelines(1)
  3997. nonstop=0
  3998. CALL waiting()
  3999. RETURN
  4000.  
  4001.  
  4002. browse:
  4003. curdironly=0
  4004. brdir=PRAGMA('D')
  4005. brfilenum=1
  4006. nonstop=0
  4007. IF files.0<1 THEN RETURN
  4008. lastfile=countcheck('Numbers/LastFile' 0)
  4009. IF lastfile<1 THEN RETURN
  4010. CALL postfour('Browse:' arg)
  4011. onearg=0
  4012. IF arg='' THEN
  4013.   DO
  4014.     lin='Browsing'
  4015.     test=getinput(1 1 'Browse one library only? (Ny) > ')
  4016.     IF test='Y' THEN
  4017.       DO
  4018.         IF chdir()>0 THEN RETURN
  4019.         curdironly=1
  4020.         lin=lin 'the' pen3||plaindir||def 'library'
  4021.         t=libpath||plaindir'.txt'
  4022.         IF edinfo(t,plaindir,'File Library') THEN RETURN
  4023.       END
  4024.     ELSE lin=lin 'all file libraries'
  4025.     lin=lin 'backwards from latest file.'
  4026.     SAY lin||CR
  4027.     SAY CR
  4028.   END
  4029. ELSE onearg=1
  4030. i=0
  4031. IF arg='' | UPPER(arg)='NEW' | UPPER(arg)='ALL' THEN
  4032.   DO lastfileloop=1
  4033.     IF lastfile<1 THEN RETURN
  4034.     arg=WORD(files.lastfile,2)
  4035.     brfilenum=lastfile
  4036.     IF WORD(files.lastfile,2)~='' THEN LEAVE lastfileloop
  4037.     lastfile=lastfile-1
  4038.   END
  4039. ELSE IF DATATYPE(arg,'W') THEN
  4040.   DO
  4041.     brfilenum=arg
  4042.     arg=WORD(files.arg,2)
  4043.     IF arg='' THEN
  4044.       DO
  4045.         SAY 'File number' brfilenum 'does not exist in the current libraries!'CR
  4046.         RETURN
  4047.       END
  4048.   END
  4049. ELSE
  4050.   DO
  4051.     IF onearg THEN CALL busywait(4 1)
  4052.     DO ni=lastfile TO 1 BY -1
  4053.       IF onearg THEN CALL busywait(60 ni lastfile)
  4054.       IF UPPER(WORD(files.ni,2))~=UPPER(arg) THEN ITERATE ni
  4055.       brfilenum=ni
  4056.       CALL busywait(4 0)
  4057.       LEAVE ni
  4058.     END
  4059.     IF ni<1 THEN
  4060.       DO
  4061.         SAY 'Unable to find a file description for' pen3||arg||def'.'CR
  4062.         RETURN
  4063.       END
  4064.   END
  4065. IF ~curdironly THEN CALL setdir(libpath||WORD(files.brfilenum,1))
  4066. savearg=arg
  4067. IF brfilenum>lastfile THEN brfilenum=lastfile
  4068. newfilesdate=DATE('S') TIME()
  4069. DO browseloop=1
  4070.   IF curdironly THEN CALL busywait(4 1)
  4071.   DO ni=brfilenum TO 0 BY -1
  4072.     IF ni=0 THEN LEAVE browseloop
  4073.     IF files.ni='' THEN ITERATE ni
  4074.     IF onearg THEN
  4075.       DO
  4076.         CALL busywait(60 ni lastfile)
  4077.         IF UPPER(arg)~=UPPER(WORD(files.ni,2)) THEN ITERATE ni
  4078.         IF (ni//30)>0 THEN CALL busywait(4 1)
  4079.         LEAVE ni
  4080.       END
  4081.     testdir=UPPER(WORD(files.ni,1))
  4082.     IF curdironly & UPPER(plaindir)~=UPPER(testdir) THEN
  4083.       DO
  4084.         IF ni>lastbrowse THEN lastbrowse=ni
  4085.         IF ni>0 THEN CALL busywait(60 ni lastfile)
  4086.         ITERATE ni
  4087.       END
  4088.     IF FIND(data.21,testdir)>0 | finddirnum(testdir)>level THEN
  4089.       DO
  4090.         IF ni>lastbrowse THEN lastbrowse=ni
  4091.         ITERATE ni
  4092.       END
  4093.     LEAVE ni
  4094.   END
  4095.   IF curdironly | onearg THEN CALL busywait(4 0)
  4096.   onearg=0
  4097.   IF ni=0 THEN brfilenum=lastbrowse
  4098.   ELSE brfilenum=ni
  4099.   argname=WORD(files.brfilenum,2)
  4100.   IF argname='' THEN RETURN
  4101.   CALL setdir(libpath||WORD(files.brfilenum,1))
  4102.   arg=bbspath'FileNotes/'plaindir'/'argname
  4103.   CALL readlines(arg 1)
  4104.   IF nonstop=1 THEN brostop=1
  4105.   ELSE brostop=0
  4106.   CALL seelines(1)
  4107.   IF brfilenum>lastbrowse THEN lastbrowse=brfilenum
  4108.   CALL checktime()
  4109.   IF brostop THEN
  4110.     DO
  4111.       SAY CR
  4112.       nonstop=1
  4113.       brfilenum=brfilenum-1
  4114.     END
  4115.   ELSE
  4116.     DO
  4117.       CALL postfour('Browse:' brfilenum plaindir'/'argname)
  4118.       line=''
  4119.       endtest=UPPER(RIGHT(argname,4))
  4120.       IF FIND('.ARC .ARJ .DMS .LHA .LZH .LZX .RUN .ZIP .ZOO',endtest)>0 THEN
  4121.         line='['pen3'C'def']ontents ['pen3'D'def']ownload'
  4122.       ELSE line='['pen3'D'def']ownload'
  4123.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4124.         line=line '['pen3'E'def']dit'
  4125.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4126.         line=line '['pen3'K'def']ill'
  4127.       IF level>sysoplevel THEN line=line '['pen3'L'def']ib'
  4128.       line=line '['pen3'M'def']ark ['pen3'N'def']on-Stop'
  4129.       IF endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15))) THEN
  4130.         line=line '['pen3'R'def']ead'
  4131.       line=line '['pen3'Q'def']uit ['pen3'?'def'] > '
  4132.       brcom=getinput(1 0 line)
  4133.       IF DATATYPE(brcom,'W') THEN
  4134.         DO
  4135.           brfilenum=brcom+1
  4136.           IF brfilenum>lastfile THEN brfilenum=lastfile+1
  4137.           IF brfilenum<1 THEN brfilenum=1
  4138.           SAY CR
  4139.         END
  4140.       ELSE brcom=LEFT(brcom,1)
  4141.       CALL cleanline(0)
  4142.       IF brcom='Q' THEN LEAVE browseloop
  4143.       IF brcom='M' THEN
  4144.         DO
  4145.           wordnum=FIND(data.25,brfilenum)
  4146.           IF wordnum=0 THEN
  4147.             DO
  4148.               data.25=STRIP(data.25 brfilenum)
  4149.               SAY lineup||argname 'marked for next download.'CR
  4150.               SAY CR
  4151.             END
  4152.           ELSE
  4153.             DO
  4154.               data.25=STRIP(DELWORD(data.25,wordnum,1))
  4155.               SAY argname 'removed from download list.'CR
  4156.             END
  4157.         END
  4158.       IF brcom='H' | brcom='?' THEN
  4159.         DO
  4160.           SAY pen3' - HELP with the Browse Files commands -'def||CR
  4161.           SAY ' RETURN reads the next file description in line.'CR
  4162.           SAY ' 34 will display the description of file number 34, if it exists.'CR
  4163.           SAY ' C  displays the contents of an archived (arc dms lzh lha zip zoo) file.'CR
  4164.           SAY ' D  displays the download menu.'CR
  4165.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4166.             DO
  4167.           SAY ' E  puts this file description into the online Editor.'CR
  4168.           SAY ' K  deletes a file you uploaded. you cannot Kill others!'CR
  4169.             END
  4170.           IF level>sysoplevel THEN
  4171.           SAY ' L  move file and description to new Library and/or rename.'CR
  4172.           SAY ' M  mark/unmark the current file for the next download'CR
  4173.           SAY ' N  displays all descriptions without pausing. CTRL-E to Exit!'CR
  4174.           SAY ' R  displays file as text. - ONLY FILES THAT END IN .TXT -'CR
  4175.           SAY ' Q  returns to the main menu(s). (Quit)'CR
  4176.           SAY CR
  4177.           CALL waiting()
  4178.           IF waitchar='Q' THEN LEAVE browseloop
  4179.         END
  4180.       ELSE IF brcom='L' & level>sysoplevel THEN
  4181.         DO
  4182.           curdir=PRAGMA('D')
  4183.           IF getinput(1 1 'Rename' argname '? (Ny) > ')='Y' THEN
  4184.             DO
  4185.               newarg=getinput(0 0 'Rename' argname 'to ')
  4186.               IF newarg~='' THEN
  4187.                 DO
  4188.                   IF is_here(newarg) THEN ITERATE browseloop
  4189.                   IF wi=999999 THEN ITERATE browseloop
  4190.                   IF EXISTS(libpath||filedir'/'newarg) THEN
  4191.                     DO
  4192.                       SAY CR
  4193.                       SAY '***' newarg 'already exists!'CR
  4194.                       SAY CR
  4195.                       ITERATE browseloop
  4196.                     END
  4197.                   junk=getinput(1 1 'Are you SURE you want to rename' argname 'to' newarg'? (Ny) ')
  4198.                   IF junk='Y' THEN
  4199.                     DO
  4200.                       lynes.2=OVERLAY(newarg,lynes.2,7,25)
  4201.                       comment=WORD(STATEF(arg),8)
  4202.                       CALL DELETE(arg)
  4203.                       arg=bbspath'FileNotes/'plaindir'/'newarg
  4204.                       CALL savelines(arg)
  4205.                       IF comment='' THEN
  4206.                         DO
  4207.                           mpath=libpath||plaindir
  4208.                           IF RENAME(mpath'/'argname,mpath'/'newarg)=0 THEN
  4209.                             SAY 'Rename failed on main file!'CR
  4210.                         END
  4211.                       ELSE
  4212.                         DO
  4213.                           t=LASTPOS('/',comment)
  4214.                           IF t=0 THEN t=LASTPOS(':',comment)
  4215.                           mpath=LEFT(comment,t-1)
  4216.                           IF RENAME(comment,mpath'/'newarg)=1 THEN
  4217.                             ADDRESS COMMAND 'C:FileNote' arg mpath'/'newarg
  4218.                           ELSE SAY 'Rename failed on external file!'CR
  4219.                         END
  4220.                       files.brfilenum=STRIP(WORD(files.brfilenum,1)) newarg
  4221.                       anum=files.brfilenum.0
  4222.                       alpha.anum=OVERLAY(newarg,alpha.anum,1,WORDINDEX(alpha.anum,2)-2)
  4223.                       CALL send2log('RENAME:' argname 'to' newarg 'in' plaindir)
  4224.                       argname=newarg
  4225.                       sortalphaflag=1
  4226.                       savefileflag=1
  4227.                       CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  4228.                     END
  4229.                 END
  4230.             END
  4231.           IF getinput(1 1 'Move' argname '? (Ny) > ')='Y' THEN
  4232.             DO
  4233.               IF chdir()=0 THEN
  4234.                 DO
  4235.                   IF UPPER(dirs.dirnum)~=UPPER(WORD(files.brfilenum,1)) THEN
  4236.                     DO
  4237.                       CALL readlines(arg 1)
  4238.                       CALL movefile(brfilenum dirs.dirnum)
  4239.                     END
  4240.                 END
  4241.             END
  4242.           IF savefileflag>0 THEN CALL savefilelist()
  4243.           CALL setdir(curdir)
  4244.         END
  4245.       ELSE IF brcom='N' THEN
  4246.         DO
  4247.           brfilenum=brfilenum-1
  4248.           nonstop=1
  4249.           SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E'def||CR
  4250.           SAY CR
  4251.           CALL DELAY(99)
  4252.           brcom=''
  4253.         END
  4254.       ELSE IF brcom='C' THEN
  4255.         DO
  4256.           temp=STRIP(WORD(STATEF(arg),8))
  4257.           IF temp='' THEN temp=libpath||plaindir'/'argname
  4258.           CALL Contents.rexx(temp)
  4259.           IF EXISTS('RAM:CONTENTS') THEN
  4260.             DO
  4261.               CALL cleanline(1)
  4262.               CALL showtext('RAM:CONTENTS' 0)
  4263.               IF waitchar~='Q' THEN CALL waiting()
  4264.               nonstop=0
  4265.             END
  4266.           ELSE SAY pen3'Not an archived file.'def||CR
  4267.         END
  4268.       ELSE IF brcom='D' THEN
  4269.         DO
  4270.           arg2=arg
  4271.           arg=brfilenum
  4272.           CALL dload()
  4273.           arg=arg2
  4274.         END
  4275.       ELSE IF brcom='E' THEN
  4276.         DO
  4277.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4278.             DO
  4279.               firstedit=5
  4280.               IF level>sysoplevel THEN firstedit=1
  4281.               CALL bbsEd.rexx(firstedit arg name TRUNC(maxtime-TIME('E'))-28)
  4282.               CALL checkfilechanges()
  4283.             END
  4284.         END
  4285.       ELSE IF brcom='K' THEN
  4286.         DO
  4287.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  4288.             DO
  4289.               IF getinput(1 1 pen3'Do you really want to kill this file? (nY) >'def)~='N' THEN
  4290.                 DO
  4291.                   tempnum=WORD(lynes.1,2)
  4292.                   IF tempnum=lastfile THEN
  4293.                     DO
  4294.                       CALL DELETE(bbspath'Numbers/LastFile')
  4295.                       CALL DELAY(28)
  4296.                       lastfile=lastfile-1
  4297.                       CALL countcheck('Numbers/LastFile' lastfile)
  4298.                     END
  4299.                   files.tempnum=''
  4300.                   tempnum2=files.tempnum.0
  4301.                   alpha.tempnum2='0 0' tempnum '100'
  4302.                   savefileflag=1
  4303.                   IF SHOW('P','BBBBS_LOCAL') THEN CALL savefilelist()
  4304.                   finfo=STATEF(arg)
  4305.                   IF WORDS(finfo)>7 THEN argname=WORD(finfo,8)
  4306.                   CALL DELETE(argname)
  4307.                   CALL DELETE(arg)
  4308.                   CALL send2log('Killed:' argname)
  4309.                   SAY argname pen3'has been deleted.'def||CR
  4310.                   CALL DELETE(libpath||plaindir'/.'STRIP(LEFT(plaindir,15)))
  4311.                 END
  4312.             END
  4313.         END
  4314.       ELSE IF brcom='R' & (endtest='.TXT' | UPPER(argname)='.'UPPER(STRIP(LEFT(plaindir,15)))) THEN
  4315.         DO
  4316.           vcount=WORD(lynes.2,7)+1
  4317.           lynes.2=STRIP(DELWORD(lynes.2,7,1)) vcount
  4318.           edtype=''
  4319.           CALL savelines(arg)
  4320.           CALL showtext(argname 1)
  4321.         END
  4322.       ELSE brfilenum=brfilenum-1
  4323.     END
  4324. END
  4325. CALL setdir(brdir)
  4326. waitchar=''
  4327. IF nonstop THEN CALL waiting()
  4328. nonstop=0
  4329. CALL savedata(0)
  4330. RETURN
  4331.  
  4332.  
  4333. movefile:
  4334. PARSE ARG fnum movdir .
  4335. fromdir=STRIP(WORD(files.fnum,1))
  4336. farg=STRIP(WORD(files.fnum,2))
  4337. md=libpath||movdir
  4338. mf=md'/'farg
  4339. fd=libpath||fromdir
  4340. ff=fd'/'farg
  4341. CALL DELETE(md'/.'STRIP(LEFT(movdir,15)))
  4342. CALL DELETE(fd'/.'STRIP(LEFT(fromdir,15)))
  4343. fn=bbspath'FileNotes/'fromdir'/'farg
  4344. commen=WORD(STATEF(fn),8)
  4345. IF commen~='' THEN
  4346.   DO
  4347.     ff=commen
  4348.     n=LASTPOS('/',ff)
  4349.     IF n>1 THEN
  4350.       DO
  4351.         xf=SUBSTR(ff,n+1)
  4352.         tfd=LEFT(ff,n-1)
  4353.         n=LASTPOS('/',tfd)
  4354.         IF n=0 THEN n=LASTPOS(':',tfd)
  4355.         IF n>0 THEN
  4356.           DO
  4357.             tmd=LEFT(tfd,n)||movdir
  4358.             SAY 'Rename external file'pen3 ff||def||CR
  4359.             IF getinput(1 1 '                  to'pen3 tmd'/'farg||def'? (Ny) > ')='Y' THEN
  4360.               DO
  4361.                 fd=tfd
  4362.                 md=tmd
  4363.                 mf=md'/'farg
  4364.                 commen=md'/'xf
  4365.               END
  4366.             ELSE IF getinput(1 1 '          or move to'pen3 mf||def'? (Ny) > ')='Y' THEN
  4367.               DO
  4368.                 fd=tfd
  4369.                 commen=''
  4370.               END
  4371.           END
  4372.       END
  4373.   END
  4374. CALL MAKEDIR(md)
  4375. IF RENAME(ff,mf)=0 THEN
  4376.   DO
  4377.     ADDRESS COMMAND 'C:COPY' ff mf
  4378.     IF EXISTS(mf) THEN
  4379.       IF DELETE(ff)~=1 THEN SAY pen3'Unable to delete'def ff||pen3'.'def||CR
  4380.   END
  4381. files.fnum=movdir farg
  4382. lynes.3=DELWORD(lynes.3,WORDS(lynes.3),1)
  4383. lynes.3=STRIP(lynes.3) movdir
  4384. CALL MAKEDIR(bbspath'FileNotes/'movdir)
  4385. mn=bbspath'FileNotes/'movdir'/'farg
  4386. CALL savelines(mn)
  4387. ndx=files.fnum.0
  4388. dnum=finddirnum(movdir)
  4389. alpha.ndx=OVERLAY(RIGHT(dnum,2) movdir,alpha.ndx,31,15)
  4390. IF EXISTS(mn) THEN
  4391.   DO
  4392.     CALL DELETE(fn)
  4393.     comm='C:FileNote' mn
  4394.     IF commen~='' THEN comm=comm commen
  4395.     ADDRESS COMMAND comm
  4396.   END
  4397. savefileflag=1
  4398. line='Moved:' fromdir'/'farg 'to' movdir
  4399. CALL send2log(line)
  4400. SAY line||CR
  4401. RETURN
  4402.  
  4403.  
  4404. textsearch:
  4405. ARG sfile' 'sarg
  4406. IF sarg='' THEN RETURN 0
  4407. x=OPEN(f,sfile,'R')
  4408. IF x=0 THEN RETURN 0
  4409. stemp=UPPER(READCH(f,65000))
  4410. CALL CLOSE(f)
  4411. retflag=0
  4412. IF POS(sarg,stemp)>0 THEN retflag=1
  4413. DROP stemp
  4414. RETURN retflag
  4415.  
  4416.  
  4417. bbsSEARCH:
  4418. smenu=menu
  4419. test=UPPER(LEFT(arg,1))
  4420. IF test='F' THEN smenu='FILE'
  4421. IF test='M' THEN smenu='MSG'
  4422. IF test='U' THEN smenu='MAIN'
  4423. IF smenu='ALL' THEN
  4424.   DO
  4425.     junk=getinput(1 1 'Search ['pen3'F'def']iles ['pen3'M'def']essages or ['pen3'U'def']sers (fmu) > ')
  4426.     IF junk='F' THEN smenu='FILE'
  4427.     ELSE IF junk='M' THEN smenu='MSG'
  4428.     ELSE IF junk='U' THEN smenu='MAIN'
  4429.     ELSE RETURN
  4430.   END
  4431. IF WORDS(arg)>1 THEN searcharg=UPPER(SUBSTR(arg,WORDINDEX(arg,2)))
  4432. ELSE searcharg=getinput(0 0 pen3'Search Phrase: 'def)
  4433. IF LENGTH(STRIP(searcharg))=0 THEN RETURN
  4434. searcharg=COMPRESS(searcharg,'*')
  4435. CALL send2log('SEARCH:' smenu 'for' searcharg)
  4436. IF smenu='NEW' | smenu='MAIN' THEN
  4437.   DO
  4438.     SAY 'Searching Userlist...'lineup||CR
  4439.     CALL FileList(bbspath'Users/*'searcharg'*',sl)
  4440.     SAY 'Found' sl.0 'matches                    'CR
  4441.     DO i=1 TO sl.0
  4442.       SAY sl.i||CR
  4443.       IF ~nonstop THEN
  4444.         IF i//linesperpage=0 THEN
  4445.           IF waiting2() THEN LEAVE i
  4446.     END
  4447.     DROP sl.
  4448.   END
  4449. IF smenu='MSG' THEN
  4450.   DO
  4451.     CALL SETCLIP('BBSMSG_SEARCH',searcharg)
  4452.     SAY lm
  4453.     CALL bbsMsg.rexx(maxtime-TRUNC(TIME('E')) name password) 
  4454.   END
  4455. IF smenu='FILE' THEN
  4456.   DO
  4457.     lne=pen3'Searching'
  4458.     curdironly=0
  4459.     IF getinput(1 1 'Search one library only? (Ny) > ')='Y' THEN
  4460.       DO
  4461.         IF chdir()>0 THEN RETURN
  4462.         curdironly=1
  4463.         lne=lne 'the'def plaindir pen3'library'
  4464.         SAY CR
  4465.       END
  4466.     ELSE
  4467.       DO
  4468.         lne=lne 'all file libraries'
  4469.         SAY CR
  4470.         SAY pen3'WARNING!'def 'Searching' RIGHT(files.0,5) '['pen3'F'def']ull descriptions may take'pen3 TRUNC(files.0/(114*cpu)+.05,1) def'minutes!'CR
  4471.       END
  4472.     test=getinput(1 1 '   ['pen3'A'def']lphaList search or ['pen3'F'def']ull descriptions? (Afq) > ')
  4473.     IF test='Q' THEN RETURN
  4474.     SAY CR
  4475.     SAY lne 'for'def UPPER(searcharg)||CR
  4476.     SAY pen3' - To ABORT, press CTRL-E -'def||CR
  4477.     SAY CR
  4478.     IF test~='F' THEN
  4479.       DO
  4480.         CALL fileheader()
  4481.         IF curdironly=1 THEN
  4482.           DO
  4483.             af=libpath||dirs.dirnum'/.'STRIP(LEFT(dirs.dirnum,15))
  4484.             IF EXISTS(af) THEN
  4485.               DO
  4486.                 CALL readlines(af 1)
  4487.                 DO i=1 TO lynes.0
  4488.                   CALL busywait(8 i lynes.0)
  4489.                   tempnum=POS(UPPER(searcharg),UPPER(lynes.i))
  4490.                   IF tempnum>0 THEN
  4491.                     DO
  4492.                       CALL busywait(4 0)
  4493.                       SAY lynes.i||CR
  4494.                       SAY pen3||LEFT(' ',tempnum-1)||lineup||UPPER(searcharg)||def||CR
  4495.                       CALL busywait(4 1)
  4496.                     END
  4497.                 END
  4498.               END
  4499.           END
  4500.         IF curdironly=0 | ~EXISTS(af) THEN
  4501.           DO i=1 TO alpha.0
  4502.             CALL busywait(60 i alpha.0)
  4503.             ii=WORD(alpha.i,4)
  4504.             IF ii>level THEN ITERATE i
  4505.             IF curdironly=1 & ii~=dirnum THEN ITERATE i
  4506.             ii=WORD(alpha.i,3)
  4507.             IF POS(UPPER(WORD(files.ii,1)),data.21)>0 THEN ITERATE i
  4508.             tempnum=POS(UPPER(searcharg),UPPER(alpha.i))
  4509.             IF tempnum>0 THEN
  4510.               DO
  4511.                 CALL busywait(4 0)
  4512.                 SAY alpha.i||CR
  4513.                 SAY pen3||LEFT(' ',tempnum-1)||lineup||UPPER(searcharg)||def||CR
  4514.                 CALL busywait(4 1)
  4515.               END
  4516.           END
  4517.       END
  4518.     ELSE
  4519.       DO
  4520.         cck=countcheck('Numbers/LastFile' 0)
  4521.         nonstop=1
  4522.         DO i=1 TO cck
  4523.           IF i//50=0 THEN CALL checkdcd()
  4524.           iii=cck+1-i
  4525.           IF files.iii='' THEN ITERATE i
  4526.           ii=files.iii.0
  4527.           ii=WORD(alpha.ii,4)
  4528.           IF ii>level THEN ITERATE i
  4529.           IF curdironly=1 & ii~=dirnum THEN ITERATE i
  4530.           IF POS(UPPER(WORD(files.iii,1)),data.21)>0 THEN ITERATE i
  4531.           farg=WORD(files.iii,1)'/'WORD(files.iii,2)
  4532.           SAY '1B'x'M' RIGHT(farg,40) LEFT(iii,7)||CR
  4533.           IF textsearch(bbspath'FileNotes/'farg searcharg) THEN
  4534.             DO
  4535.               savei=i
  4536.               CALL readlines(bbspath'FileNotes/'farg 1)
  4537.               nonstop=1
  4538.               CALL seelines(2)
  4539.               i=savei
  4540.               SAY CR
  4541.               SAY CR
  4542.             END
  4543.         END
  4544.       END
  4545.     CALL busywait(4 0)
  4546.   END
  4547. searcharg=''
  4548. nonstop=0
  4549. SAY CR
  4550. IF i<999999 THEN SAY lineup'All available items have been searched.                        'CR
  4551. SAY CR
  4552. CALL waiting()
  4553. RETURN
  4554.  
  4555.  
  4556. finddirnum:
  4557. ARG fdirname .
  4558. DO fdir=1 TO 99
  4559.   IF UPPER(dirs.fdir)=UPPER(fdirname) THEN RETURN fdir
  4560. END
  4561. RETURN 100
  4562.  
  4563.  
  4564. writebuffer:
  4565. PARSE ARG bufname .
  4566. Capture OFF
  4567. CALL DELETE(bufname)
  4568. SAY 'Type 'pen3'/E'def' or 'pen3'/S'def' on a new line to Exit and Save.'CR
  4569. IF EXISTS(bufname) THEN
  4570.   DO
  4571.     CALL DELAY(56)
  4572.     CALL DELETE(bufname)
  4573.     CALL DELAY(56)
  4574.   END
  4575. CaptWrap 74
  4576. Send pen3
  4577. Capture bufname
  4578. Send def
  4579. TimeOut 120
  4580. DO bufloop=1
  4581.   Wait '/E,/S,RING,NO CARRIER'
  4582.   Status 'L'
  4583.   test=LEFT(UPPER(cleanstring(0':'RESULT)),2)
  4584.   CALL checkdcd()
  4585.   IF test='/E' | test='/S' | test='/X' THEN LEAVE bufloop
  4586. END
  4587. IF test~='/X' THEN Send '\b\b'pen3
  4588. Capture OFF
  4589. CALL checkdcd()
  4590. TimeOut maxidle
  4591. SAY def||CR
  4592. startnum=lynes.0+1
  4593. CALL readlines(bufname startnum)
  4594. CALL wrapbuf(startnum)
  4595. QUEUE CR
  4596. RETURN
  4597.  
  4598.  
  4599. wrapbuf:
  4600. ARG startnum .
  4601. CALL cleanline(1)
  4602. SAY pen3'Wordwrapping...'def||CR
  4603. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  4604. lynes.startnum=cleanstring(2':'lynes.startnum)
  4605. DO wi=startnum WHILE wi<=lynes.0
  4606.   wj=wi+1
  4607.   lynes.wj=TRANSLATE(lynes.wj,' ','09'x)
  4608.   lynes.wj=cleanstring(2':'lynes.wj)
  4609.   IF LENGTH(lynes.wi)>75 THEN
  4610.     DO
  4611.       testchar=''
  4612.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  4613.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  4614.         DO
  4615.           DO wjj=lynes.0 TO wi+1 BY -1
  4616.             wk=wjj+1
  4617.             lynes.wk=lynes.wjj
  4618.           END
  4619.           lynes.wj=''
  4620.           lynes.0=lynes.0+1
  4621.         END
  4622.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  4623.         IF WORDS(lynes.wi)=1 THEN
  4624.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  4625.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  4626.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  4627.       END
  4628.     END
  4629. END
  4630. RETURN
  4631.  
  4632.  
  4633. seelines:
  4634. ARG fancy .
  4635. DO i=1 TO lynes.0
  4636.   IF fancy=0 THEN SAY lynes.i||def||CR
  4637.   ELSE
  4638.     DO
  4639.       IF LEFT(lynes.i,2)=': ' & WORDS(lynes.i)=2 THEN ITERATE i
  4640.       ELSE IF LEFT(lynes.i,10)='Directory ' | LEFT(lynes.i,5)='=====' THEN
  4641.         SAY pen3||lynes.i||def||CR
  4642.       ELSE SAY lynes.i||CR
  4643.       IF fancy=2 & colorflag=1 THEN
  4644.         DO
  4645.           IF searcharg~='' THEN
  4646.             DO
  4647.               testpos=POS(UPPER(searcharg),UPPER(lynes.i))
  4648.               IF testpos>0 THEN
  4649.                 SAY LEFT(' ',testpos-1)||pen3||lineup||UPPER(searcharg)||def||CR
  4650.             END
  4651.           IF i=1 THEN
  4652.             IF WORD(lynes.1,3)='Reply' THEN
  4653.               DO
  4654.                 testpos=WORDINDEX(lynes.1,3)
  4655.                 SAY LEFT(' ',testpos-1)||pen3||lineup||SUBSTR(lynes.1,testpos)||def||CR
  4656.               END
  4657.         END
  4658.     END
  4659.   IF i//linesperpage=0 & i<lynes.0 THEN
  4660.     IF waiting2() THEN LEAVE i
  4661. END
  4662. nonstop=0
  4663. RETURN
  4664.  
  4665.  
  4666. readlines:
  4667. CALL CLOSE(f)
  4668. PARSE ARG tempname readstart .
  4669. IF ~readopen(tempname) THEN RETURN 1
  4670. IF readstart<2 THEN lynes.=''
  4671. DO ri=readstart
  4672.   line=READLN(f)
  4673.   IF EOF(f) THEN BREAK
  4674.   lynes.ri=line
  4675. END
  4676. lynes.0=ri-1
  4677. CALL CLOSE(f)
  4678. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),2)='/E' | LEFT(UPPER(lynes.ri),2)='/S'
  4679. END
  4680. lynes.0=ri
  4681. RETURN 0
  4682.  
  4683.  
  4684. savelines:
  4685. PARSE ARG tempname .
  4686. IF EXISTS(tempname) & edtype='MAIL' THEN
  4687.   DO
  4688.     ok=OPEN(f,tempname,'A')
  4689.     IF ok~=0 THEN CALL WRITELN(f,LEFT('',74,'^'))
  4690.   END
  4691. ELSE ok=OPEN(f,tempname,'W')
  4692. IF ok=0 THEN
  4693.   DO
  4694.     line='***' tempname 'failed to open for saving!'
  4695.     CALL send2log(line)
  4696.     SAY line||CR
  4697.     RETURN 1
  4698.   END
  4699. DO wi=1 TO lynes.0
  4700.   CALL WRITELN(f,lynes.wi)
  4701. END
  4702. CALL CLOSE(f)
  4703. RETURN 0
  4704.  
  4705.  
  4706. sortuserlist:
  4707. uf=bbspath'Lists/USERS'
  4708. IF sortuserflag THEN CALL DELETE(uf)
  4709. sortuserflag=0
  4710. IF ~EXISTS(uf) THEN
  4711.   DO
  4712.     users=bbsSortUsers.rexx(bbspath bbsname)
  4713.     RETURN
  4714.   END
  4715. ELSE
  4716.   DO
  4717.     IF OPEN(f,uf,'R')=0 THEN RETURN
  4718.     users=0
  4719.     DO i=1
  4720.       dat=READCH(f,65000)
  4721.       IF EOF(f) THEN LEAVE i
  4722.       users=users+WORDS(dat)
  4723.     END
  4724.     CALL CLOSE(f)
  4725.   END
  4726. SAY CENTER(RIGHT(users,8) 'Users on'pen3 bbsname,74)||def||CR
  4727. RETURN
  4728.  
  4729.  
  4730. showuserlist:
  4731. IF data.5='' THEN line='Here are the EMail names of the' users 'users on' bbsname '.'
  4732. ELSE line='   'users 'users. Use these names to address messages.'
  4733. SAY pen3||line||def||CR
  4734. CALL showtext(bbspath'Lists/USERS' 1)
  4735. IF data.5~='' THEN CALL waiting()
  4736. RETURN
  4737.  
  4738.  
  4739. msgcount:
  4740. ARG countdir .
  4741. lastmess=0
  4742. totmsgs=0
  4743. unred=0
  4744. IF ~EXISTS(msgpath||countdir) THEN RETURN
  4745. IF STATEF(msgpath||countdir)=msg.countdir.1 THEN totmsgs=msg.countdir.0
  4746. ELSE
  4747.   DO
  4748.     totmsgs=WORDS(SHOWDIR(msgpath||countdir))
  4749.     msg.countdir.0=totmsgs
  4750.     msg.countdir.1=STATEF(msgpath||countdir)
  4751.   END
  4752. IF countdir>level | FIND(data.21,i)>0 THEN RETURN
  4753. lastread.countdir=WORD(data.22,countdir)
  4754. IF ~DATATYPE(lastread.countdir,'W') THEN lastread.countdir=0
  4755. lastmess=countcheck('Numbers/LastMessage'countdir 0)
  4756. IF lastread.countdir<0 THEN RETURN
  4757. firstmess=countcheck('Numbers/FirstMessage'countdir 0)
  4758. IF lastread.countdir<firstmess THEN lastread.countdir=firstmess-1
  4759. IF lastmess>0 THEN
  4760.   IF lastread.countdir>=0 THEN
  4761.     DO
  4762.       IF lastread.countdir<(firstmess-1) THEN lastread.countdir=firstmess-1
  4763.       unred=lastmess-lastread.countdir
  4764.       IF unred>totmsgs THEN unred=totmsgs
  4765.       IF unred>0 | ~logonflag THEN
  4766.         DO
  4767.           cline=RIGHT(unred,5) 'new of' RIGHT(lastmess,5) 'messages,'
  4768.           cline=cline RIGHT(totmsgs,5) 'still online in' 
  4769.           cline=cline RIGHT(countdir,2)',' msg.countdir
  4770.           SAY pen6||cline||def||CR
  4771.         END
  4772.     END
  4773. RETURN
  4774.  
  4775.  
  4776. counts:
  4777. SAY CR
  4778. SAY 'Working...'CR
  4779. SAY CR
  4780. temp=''
  4781. DO i=1 TO 4
  4782.   temp=temp||CENTER(copyright.i,75)||'0D0A'x
  4783. END
  4784. CALL SETCLIP('BBS_copyright',temp||CR)
  4785. CALL bbsSTATS.rexx(name colorflag 0 emailonline grand grand2 files.0 users)
  4786. SAY CR
  4787. CALL waiting2()
  4788. IF waitchar='Q' THEN RETURN
  4789. CALL showmarked(1)
  4790. CALL logonstats()
  4791. nonstop=0
  4792. CALL waiting()
  4793. RETURN
  4794.  
  4795.  
  4796. countmail:
  4797. SAY '   Counting online email...'lineup||CR
  4798. emailonline=0
  4799. t=SHOWDIR(bbspath'Users')
  4800. DO ti=1 TO WORDS(t)
  4801.   emailonline=emailonline+WORDS(SHOWDIR(bbspath'Email/'WORD(t,ti)))
  4802. END
  4803. SAY lineup'       'emailonline' letters online.'CR
  4804. RETURN
  4805.  
  4806.  
  4807. hourly:
  4808. IF level=99 & nonstop~=1 THEN
  4809.   DO
  4810.     IF getinput(1 1 'Zero The Hourly Averages? (Ny) > ')='Y' THEN
  4811.       ADDRESS COMMAND 'C:Delete >*' bbspath'Numbers/Hourly/#?'
  4812.     CALL cleanline(1)
  4813.   END
  4814. SAY lm
  4815. CALL ShowHourly.rexx(name linesperpage colorflag nonstop)
  4816. RETURN
  4817.  
  4818.  
  4819. logonstats:
  4820. IF level=0 THEN RETURN
  4821. SAY bak2||name||def 'Last on' DATE('W',lastondate,'I') DATE(,lastondate,'I') lastontime||CR
  4822. tempnum=countcheck('Numbers/LastFile' 0)-lastbrowse
  4823. IF tempnum>files.0 THEN tempnum=files.0
  4824. line=RIGHT(countcheck('Numbers/LastFile' 0),5) 'uploaded,'
  4825. line=line RIGHT(files.0,5) 'files online.'CR
  4826. IF tempnum>0 THEN SAY RIGHT(tempnum,5) 'new of' line
  4827. ELSE SAY '   No new of' line
  4828. totmsg=0
  4829. grand=0
  4830. grand2=0
  4831. DO i=1 TO 99
  4832.   IF msg.i='' THEN ITERATE i
  4833.   CALL msgcount(i)
  4834.   totmsg=totmsg+unred
  4835.   grand=grand+totmsgs
  4836.   grand2=grand2+lastmess
  4837. END
  4838. line=RIGHT(grand2,5) 'messages,' RIGHT(grand,5) 'still online.'||CR
  4839. IF totmsg>0 THEN SAY RIGHT(totmsg,5) 'new of' line
  4840. ELSE SAY '   No new of' line
  4841.  
  4842. callsleft:
  4843. test=WORD(data.11,9)
  4844. IF test<1 THEN
  4845.   DO
  4846.     IF DATE('S')=WORD(data.13,1) THEN
  4847.       DO
  4848.         line=pen0||bak1' Attention! 'def 'This is your last call for'
  4849.         line=line DATE('W')',' DATE()
  4850.       END
  4851.     ELSE line='It''s after midnight here, you may call' WORD(data.11,5) 'more times today.'
  4852.   END
  4853. ELSE
  4854.   DO
  4855.     line='You may call' test 'more time'
  4856.     IF test~=1 THEN line=line's'
  4857.     line=line 'today.'
  4858.   END
  4859. SAY line||CR
  4860. RETURN
  4861.  
  4862.  
  4863. checkdcd:
  4864. IF GETCLIP('BBS_interpret')='' THEN
  4865.   DO
  4866.     dcd
  4867.     IF RC=0 THEN
  4868.       DO
  4869.         DO dcds=1 TO 3  /* 5 second delay */
  4870.           CALL DELAY(50)
  4871.           dcd
  4872.           IF RC~=0 THEN RETURN
  4873.         END
  4874.         dcd
  4875.         IF RC=0 THEN
  4876.           DO
  4877.             SAY CR
  4878.             Capture OFF
  4879.             Remote OFF
  4880.             CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  4881.             line='^^^^^ LOST CARRIER! ^^^' DATE() TIME() '^^^^^'
  4882.             SAY line||CR
  4883.             Send '\dATH1\r'
  4884.             CALL send2log(line)
  4885.             CALL sound('LOST')
  4886.             IF newpassword='' THEN SIGNAL DONE
  4887.             ELSE SIGNAL OUT
  4888.           END
  4889.       END
  4890.   END
  4891. CALL checkexternal()
  4892. RETURN
  4893.  
  4894.  
  4895. sound:
  4896. ARG snd 
  4897. IF bbsprefs.13=1 THEN RETURN
  4898. ADDRESS AREXX bbsSounds.rexx bbspath'Sounds/' snd 
  4899. RETURN
  4900.  
  4901.  
  4902. checkexternal:
  4903. xmsg=GETCLIP('BBS_MESSAGE')
  4904. Capture
  4905. IF RC=0 & xmsg~='' & uldlflag=0 THEN
  4906.   DO
  4907.     SAY CR
  4908.     SAY bak2' Message From BBBBS: 'def||CR
  4909.     SAY xmsg||CR
  4910.     SAY CR
  4911.     CALL SETCLIP('BBS_MESSAGE')
  4912.     CALL waiting()
  4913.   END
  4914. xstring=GETCLIP('BBS_interpret')
  4915. IF xstring~='' THEN
  4916.   DO
  4917.     CALL SETCLIP('BBS_interpret')
  4918.     INTERPRET xstring
  4919.   END
  4920. xcom=GETCLIP('BBS_COMMAND')
  4921. IF xcom~='' THEN
  4922.   DO
  4923.     CALL SETCLIP('BBS_COMMAND')
  4924.     IF POS('G',xcom)>0 THEN SIGNAL LOGOUT2
  4925.     IF opt~='' THEN
  4926.       DO
  4927.         IF POS('B',xcom)>0 THEN test='/X'
  4928.         IF POS('L',xcom)>0 THEN CALL uplevel()
  4929.         IF POS('M',xcom)>0 THEN CALL validate('DEF.MEMBER')
  4930.         IF POS('R',xcom)>0 THEN CALL upratio()
  4931.         IF POS('T',xcom)>0 THEN CALL uptime()
  4932.         IF POS('V',xcom)>0 THEN CALL validate('DEF.CBV')
  4933.       END
  4934.     IF POS('C',xcom)>0 THEN CALL chat()
  4935.   END
  4936. RETURN
  4937.  
  4938.  
  4939. chat:
  4940. chatrequest=0
  4941. chattime=TIME('E')
  4942. SAY 'Entering chat mode with sysop.'CR
  4943. MSG pen3'- Press backslash [\] to exit -'def
  4944. SAY 'Press [RETURN] twice to tell' sysop 'you are finished typing.'CR
  4945. SAY CR
  4946. OPTIONS PROMPT ''
  4947. string=''
  4948. DO WHILE(string~='\')
  4949.   PULL string
  4950.   CALL checkdcd()
  4951. END
  4952. addtime=addtime+(TIME('E')-chattime)%1
  4953. maxtime=maxtime+addtime
  4954. RETURN
  4955.  
  4956.  
  4957. readopen:
  4958. PARSE ARG fname
  4959. ok=OPEN(f,fname,'R')
  4960. IF ok~=0 THEN RETURN 1
  4961. line=fname 'failed to open for reading!'
  4962. SAY line||CR
  4963. CALL send2log(line)
  4964. RETURN 0
  4965.  
  4966.  
  4967. writeopen:
  4968. PARSE ARG fname
  4969. CALL CLOSE(f)
  4970. ok=OPEN(f,fname,'W')
  4971. IF ok~=0 THEN RETURN 1
  4972. line=fname 'failed to open for writing!'
  4973. SAY line||CR
  4974. CALL send2log(line)
  4975. RETURN 0
  4976.  
  4977.  
  4978. set_grand:
  4979. SAY 'Setting up public message conferences...'CR
  4980. grand=0
  4981. DO i=1 TO 99
  4982.   IF msg.i='' THEN ITERATE i
  4983.   msg.i.0=WORDS(SHOWDIR(msgpath||i,'F'))
  4984.   msg.i.1=STATEF(msgpath||i)
  4985.   grand=grand+msg.i.0
  4986. END
  4987. RETURN
  4988.  
  4989.  
  4990. checkstats:          /* clip is set and cleared by stats programs */
  4991. IF TIME('H')>3 & GETCLIP('BBS_STAT')='' THEN
  4992.   DO
  4993.     IF WORD(STATEF(bbspath'Logs/Numbers.dat'),5)<DATE('I') THEN
  4994.       ADDRESS AREXX bbsNumbers.rexx
  4995.     ELSE IF EXISTS(bbspath'Information/STATS.ULDL') THEN
  4996.       DO
  4997.         lfinfo=STATEF(bbspath'Information/STATS.ULDL')
  4998.         IF WORD(lfinfo,5)<DATE('I') THEN
  4999.           DO
  5000.             ADDRESS AREXX bbsULDL.rexx
  5001.             CALL DELAY(99)
  5002.           END
  5003.       END
  5004.     IF TIME('H')>4 & EXISTS(bbspath'Information/STATS.USER') THEN
  5005.       DO
  5006.         ufinfo=STATEF(bbspath'Information/STATS.USER')
  5007.         IF WORD(ufinfo,5)<DATE('I') THEN
  5008.           DO
  5009.             ADDRESS AREXX bbsUSER.rexx
  5010.             CALL DELAY(99)
  5011.           END
  5012.       END
  5013.     IF grand>SYSTEM_MSG_LIMIT & TIME('H')>5 & TIME('H')<9 THEN
  5014.       DO
  5015.         SAY 'Doing Message Conference Maintenence...'CR
  5016.         Send 'ATH1\r'
  5017.         CALL bbsMAINT.baud(SYSTEM_MSG_LIMIT sysop)
  5018.         CALL set_grand()
  5019.         Send 'ATZ\r'
  5020.       END
  5021.   END
  5022. RETURN
  5023.  
  5024.  
  5025. zerovars:
  5026. lastread.=0
  5027. totwrit.=0
  5028. data.=''
  5029. libs.=''
  5030. msgs.=''
  5031. clear_marked=0
  5032. sortalphaflag=0
  5033. loadalphaflag=0
  5034. savefileflag=0
  5035. sortuserflag=0
  5036. linesperpage=22
  5037. chatrequest=0
  5038. lastbrowse=0
  5039. buildalpha=0
  5040. uldlflag=0
  5041. terseflag=0
  5042. warnings=0
  5043. winnings=0
  5044. menuflag=0
  5045. nonstop=0
  5046. libtext=1
  5047. addtime=0
  5048. dirnum=1
  5049. msgdir=1
  5050. level=0
  5051. newfilesflag=0
  5052. newfilesdate=''
  5053. newpassword=''
  5054. replymsg=''
  5055. waitchar=''
  5056. string=''
  5057. name=''
  5058. city='?'
  5059. opt=''
  5060. clr=''
  5061. RETURN
  5062.  
  5063.  
  5064. SYNTAX:
  5065. FAILURE:
  5066. lin.1=''ERRORTEXT(RC)''
  5067. lin.2=SIGL-1     SOURCELINE(SIGL-1)
  5068. lin.3=SIGL ''SOURCELINE(SIGL)''
  5069. lin.4=SIGL+1     SOURCELINE(SIGL+1)
  5070. DO er=1 TO 4
  5071.   IF level>sysoplevel THEN SAY lin.er||CR
  5072.   CALL send2log(lin.er)
  5073. END
  5074. CALL CLOSE(f)
  5075. IF newpassword='' THEN SIGNAL DONE  /* no user logged on, quit quietly */
  5076. SAY CR
  5077. CALL checkdcd()
  5078. waitchar=''
  5079. IF data.1~='' & data.5~='' & data.20~='' THEN CALL savedata(0)
  5080. SIGNAL RESTART
  5081.  
  5082.  
  5083. BREAK_E:
  5084. CALL CLOSE(f)
  5085. SAY pen3'*** CTRL-E BREAK ***'def||CR
  5086. waitchar=''
  5087. string=''
  5088. nonstop=0
  5089. rnonstop=0
  5090. brostop=0
  5091. i=999999
  5092. wi=999999
  5093. ui=999999
  5094. ni=-1
  5095. QUEUE CR
  5096. RETURN 0
  5097.  
  5098.  
  5099. HALT:
  5100. BREAK_C:
  5101. SIGNAL OFF BREAK_C
  5102. SIGNAL OFF BREAK_E
  5103. CALL CLOSE(f)
  5104. IF newpassword='' THEN
  5105.   DO
  5106.     CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  5107.     SIGNAL DONE  /* no user logged on, quit quietly */
  5108.   END
  5109. CALL checkdcd()
  5110. SAY CR
  5111. IF warnings<1 THEN  /* just 1 warning */
  5112.   DO
  5113.     warnings=warnings+1
  5114.     SAY CR
  5115.     SAY CR
  5116.     SAY CR
  5117.     SAY 'If you didn''t press CTRL-C then...   HEY!    Wake up!'CR
  5118.     SAY '                                     Auto-disconnect in' TRUNC(maxidle/60+.5) 'minutes!'CR
  5119.     SAY CR
  5120.     SAY 'If you DID press CTRL-C,  PLEASE  use CTRL-E next time instead.'CR
  5121.     SAY CR
  5122.     Remote OFF
  5123.     Send '^G\w^G\w^G^G^G^G'
  5124.     Remote ON
  5125.     waitchar=''
  5126.     string=''
  5127.     nonstop=0
  5128.     CALL SETCLIP('BBS_door')
  5129.     SIGNAL ON BREAK_C
  5130.     CALL waiting()
  5131.     SIGNAL RESTART
  5132.   END
  5133. CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  5134. SAY 'No Activity For' TRUNC(maxidle/30+.5) 'minutes! -- Disconnecting.'CR
  5135. Send '\d'
  5136. CALL sound('TIMEOUT')
  5137. SIGNAL OUT
  5138.  
  5139. LOGOUT:
  5140. junk=getinput(1 1 pen3'Leave Feedback for SysOp? (Ny) > 'def)
  5141. IF junk='Y' THEN
  5142.   CALL editor(name maxtime-TRUNC(TIME('E')) 'MAIL' sysop . 0 0 'FEEDBACK')
  5143.  
  5144. LOGOUT2:
  5145. clr=''
  5146. CALL checkexternal()
  5147. SIGNAL OFF BREAK_E
  5148. CALL SETCLIP('BBS_level')
  5149. CALL callsleft()
  5150. secs=TIME('E')
  5151. mins=secs%60
  5152. secs=TRUNC(secs//60)
  5153. IF secs<10 THEN secs='0'secs
  5154. SAY CR
  5155. SAY 'Public  files   online: 'RIGHT(comma(files.0),9)||CR
  5156. SAY 'Public messages online: 'RIGHT(comma(grand),9)||CR
  5157. SAY CR
  5158. SAY 'Time used this call:' mins':'secs||CR
  5159. SAY 'Goodbye' name', thank you for calling' bbsname'.'CR
  5160. linesperpage=99
  5161. arg=bbspath'BBS_TEXT/GOODBYE'
  5162. IF EXISTS(arg) THEN
  5163.   DO
  5164.     CALL DELAY(14)
  5165.     CALL showtext(arg 0)
  5166.   END
  5167. SAY CR
  5168. IF bbsprefs.2 & ~terseflag THEN CALL doGrin()
  5169.  
  5170. OUT:
  5171. SIGNAL OFF BREAK_E
  5172. Remote OFF
  5173. data.18=winnings
  5174. line=left(name,16,' ') 'logged off at' time('C')
  5175. dcd
  5176. IF RC~=0 THEN Send '\ah'
  5177. IF data.20~='' THEN
  5178.   DO
  5179.     Status 'Y'
  5180.     elapsed=RESULT
  5181.     line=line 'Total:'elapsed
  5182.     PARSE VAR elapsed thour':'tmin':'.
  5183.     ADDRESS AREXX bbsHOURLY.rexx TIME('H') TIME('M')//60 thour tmin bbspath'Numbers/Hourly'
  5184.     PARSE VAR data.19 dhour 'hours' dmin 'minutes in' calls .
  5185.     IF ~DATATYPE(tmin,'W')  THEN tmin=0
  5186.     IF ~DATATYPE(thour,'W') THEN thour=0
  5187.     IF ~DATATYPE(dhour,'W') THEN dhour=0
  5188.     IF ~DATATYPE(dmin,'W')  THEN dmin=0
  5189.     IF ~DATATYPE(calls,'W') THEN calls=0
  5190.     IF thour=0 & tmin<3 THEN  /* free call if less than 3 minutes */
  5191.       DO
  5192.         wordloc=WORDINDEX(data.11,9)-1
  5193.         wordval=WORD(data.11,9)+1
  5194.         data.11=STRIP(LEFT(data.11,wordloc))
  5195.         data.11=data.11 wordval 'more calls today'
  5196.       END
  5197.     ELSE IF thour>0 | tmin>(maxtime/120) THEN /* over 50% mins used */
  5198.       CALL SETCLIP('BBS_FULLCALL',name TIME('M'))
  5199.     ufile=LEFT(DATE('S'),6)
  5200.     mmins=thour*60+tmin+countcheck('Usage/'ufile 0)
  5201.     CALL countcheck('Usage/'ufile mmins)
  5202.     mins=thour*60+tmin+countcheck('Numbers/Minutes' 0)
  5203.     CALL countcheck('Numbers/Minutes' mins)
  5204.     mins=thour*60+tmin+countcheck('Numbers/Minutes'bps 0)
  5205.     CALL countcheck('Numbers/Minutes'bps mins)
  5206.     cals=countcheck('Numbers/Calls' 0)+1
  5207.     CALL countcheck('Numbers/Calls' cals)
  5208.     cals=countcheck('Numbers/Calls'bps 0)+1
  5209.     CALL countcheck('Numbers/Calls'bps cals)
  5210.     thour=thour+dhour
  5211.     tmin=tmin+dmin+1
  5212.     IF tmin>59 THEN
  5213.       DO
  5214.         thour=thour+tmin%60
  5215.         tmin=tmin//60
  5216.       END
  5217.     data.19=thour 'hours' tmin 'minutes in' calls+1 'calls.'
  5218.     CALL SETCLIP('BBS_totalusage',mmins%60 mmins//60)
  5219.     CALL SETCLIP('BBS_userlogoff',TIME('C') DATE())
  5220.     CALL postuser(6)
  5221.     IF newfilesflag=1 THEN
  5222.       DO
  5223.         newfilesdate=DATE('S') TIME()
  5224.         lastbrowse=countcheck('Numbers/LastFile' 0)
  5225.       END
  5226.     IF clear_marked=1 THEN data.24=''
  5227.     CALL savedata(1)
  5228.     data.5=''
  5229.     IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  5230.       DO
  5231.         IF sortalphaflag>0 | savefileflag>0 THEN
  5232.           CALL SETCLIP('BBS_QUICK_WAIT',1)
  5233.         ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  5234.       END
  5235.     arg=''
  5236.     lastline=RIGHT(TIME('C'),7) LEFT(DATE(),6)
  5237.     lastline=lastline'  'RIGHT(city,40)
  5238.     lastline=OVERLAY(name,lastline,16,LENGTH(name)+1) RIGHT(bps,5)
  5239.     lastline=lastline' Time:'elapsed
  5240.     newpassword=''
  5241.     IF data.20=0 THEN lastline=OVERLAY('UNVALIDATED_USER',lastline,16,38)
  5242.     CALL send2last(lastline)
  5243.     CALL bbsLOGOFF.baud(name level elapsed) 
  5244.     SAY lastline||def||CR
  5245.   END
  5246. CALL sound('LOGOFF')
  5247.  
  5248. OUT2:
  5249. CALL send2log(line)
  5250.  
  5251. DONE:
  5252. CALL send2log('')
  5253. logonflag=0
  5254. colorflag=1
  5255. CALL colors(1)
  5256.  
  5257. DONE2:
  5258. CBVflag=0
  5259. CALL setdir(libpath||dirs.1)
  5260. CALL SETCLIP('BBS_maxtime')
  5261. CALL SETCLIP('BBS_winnings')
  5262. CALL SETCLIP('BBS_minutes')
  5263. CALL SETCLIP('BBS_level')
  5264. CALL SETCLIP('BBS_door')
  5265. Capture
  5266. IF RC~=0 THEN Capture OFF
  5267. Send '\c\ah'
  5268. IF WORDS(bbsprefs.27)=8 THEN CALL dimBBcols()
  5269. ELSE IF bbsprefs.27=1 THEN CALL ScreenToBack('BAUD')
  5270. ELSE IF bbsprefs.27=2 THEN Screen OFF
  5271. ELSE CALL DELAY(14)
  5272. Remote OFF
  5273. baud maxbps
  5274. IF sortuserflag=0 & sortalphaflag=0 & savefileflag=0 & emailonline>=0 & buildalpha=0 & loadalphaflag=0 THEN
  5275.   CALL DELAY(128)
  5276. ELSE
  5277.   DO
  5278.     CALL ATZreset()
  5279.     CALL DELAY(52)
  5280.     Send 'ATH1\r'
  5281.     CALL DELAY(128)
  5282.     Send 'ATH1\r'
  5283.     IF buildalpha~=0 THEN
  5284.       DO
  5285.         CALL BuildALPHA.rexx()
  5286.         sortalphaflag=0
  5287.         loadalphaflag=0
  5288.         savefileflag=0
  5289.         buildalpha=0
  5290.       END
  5291.     IF sortuserflag=1 THEN
  5292.       DO
  5293.         CALL sortuserlist()
  5294.         IF SHOW('P','BBBBS_LOCAL') THEN
  5295.           DO
  5296.             CALL SETCLIP('BBS_localusers')
  5297.             CALL SETCLIP('BBS_mainusers',1)
  5298.           END
  5299.       END
  5300.     IF sortalphaflag>0 | savefileflag>0 | GETCLIP('BBS_resave')~='' THEN
  5301.       DO
  5302.         loadalphaflag=0
  5303.         x=GETCLIP('BBS_resave')
  5304.         IF savefileflag>0 THEN CALL savefilelist2()
  5305.         ELSE IF x='' THEN CALL savealphalist()
  5306.         x=GETCLIP('BBS_resave')
  5307.         CALL SETCLIP('BBS_resave')
  5308.         IF x=1 THEN
  5309.           DO
  5310.             sortalphaflag=1
  5311.             savefileflag=1
  5312.             SIGNAL DONE2
  5313.           END
  5314.         IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  5315.         CALL SETCLIP('BBS_QUICK_WAIT')
  5316.       END
  5317.     IF loadalphaflag=1 THEN CALL loadalpha(1)
  5318.     IF emailonline<0 THEN CALL countmail()
  5319.   END
  5320. IF bbsprefs.15=0 THEN  /* quit or restart? */
  5321.   DO
  5322.     IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5323.     CALL checkstats()
  5324.     EXIT
  5325.   END
  5326. IF STORAGE()<bbsprefs.15 THEN
  5327.   DO
  5328.     IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5329.     SAY CR
  5330.     SAY '*** Unsafe memory level!'CR
  5331.     line='*** Less than' bbsprefs.15 'bytes available, BBBBS has been unloaded.'
  5332.     SAY line||CR
  5333.     SAY CR
  5334.     CALL send2log(line)
  5335.     EXIT
  5336.   END
  5337. CALL CLOSE(f)
  5338. CALL CLOSE(log)
  5339. bad_atz=ATZreset()   /* reset modem */
  5340. CALL zerovars()
  5341. DO FOREVER
  5342.   IF GETCLIP('BBS_QUIT')='QUIT' THEN
  5343.     DO
  5344.       CALL SETCLIP('BBS_QUIT')
  5345.       CALL SETCLIP('BBS_localfiles')
  5346.       CALL SETCLIP('BBS_localusers')
  5347.       Send '\c'
  5348.       IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5349.       IF SHOW('P','BBSPOST') THEN ADDRESS 'BBSPOST' 'QUIT'
  5350.       EXIT
  5351.     END
  5352.   xstring=GETCLIP('BBS_RESET')
  5353.   IF xstring~='' THEN SIGNAL RESET
  5354.   xstring=GETCLIP('BBS_interpret')
  5355.   IF xstring~='' THEN
  5356.     DO
  5357.       CALL SETCLIP('BBS_interpret')
  5358.       INTERPRET xstring
  5359.       SIGNAL DONE2
  5360.     END
  5361.   IF GETCLIP('BBS_localfiles')>1 THEN
  5362.     DO
  5363.       CALL DELAY(150)
  5364.       Send 'ATH1\r'
  5365.       CALL SETCLIP('BBS_localfiles')
  5366.       CALL loadfiles()
  5367.       CALL loadalpha(1)
  5368.       SIGNAL DONE2
  5369.     END
  5370.   IF GETCLIP('BBS_localusers')~='' THEN
  5371.     DO
  5372.       CALL DELAY(150)
  5373.       Send 'ATH1\r'
  5374.       CALL SETCLIP('BBS_localusers')
  5375.       sortuserflag=1
  5376.       CALL sortuserlist()
  5377.       SIGNAL DONE2
  5378.     END
  5379.   CALL checkemail()
  5380.   IF bad_atz=1 THEN bad_atz=ATZreset()
  5381.   dcd
  5382.   IF RC~=0 THEN Send '\ah'
  5383.   IF GETCLIP('BBS_SLAVE')=1 THEN
  5384.     DO
  5385.       Quiet ON
  5386.       IF SHOW('P','BBS_SLAVE') THEN ADDRESS 'BBS_SLAVE' 'QUIT'
  5387.       cm=''
  5388.       t=WAITPKT('BBBBS')
  5389.       DO i=1
  5390.         p=GETPKT('BBBBS')
  5391.         IF p='0000 0000'x THEN LEAVE i
  5392.         cm=GETARG(p)
  5393.         t=REPLY(p,0)
  5394.       END
  5395.       Quiet OFF
  5396.       x=GETCLIP('BBS_SLAVE_RATE')
  5397.       CALL SETCLIP('BBS_SLAVE_RATE')
  5398.       IF cm='QUIT' THEN EXIT
  5399.       SAY 'CONNECT' x||CR
  5400.       SIGNAL LOGON
  5401.     END
  5402.   wres=''
  5403.   Wait 'RING'
  5404.   wres=RESULT
  5405.   IF wres='RING' THEN
  5406.     DO
  5407.       Send 'ATA\r'
  5408.       Timeout 45  /* wait 45 seconds for connect */
  5409.       wres=''
  5410.       Wait 'CONNECT,NO CARRIER,RING,+FCON,+FHNG'
  5411.       wres=RESULT
  5412.       CALL DELAY(28)
  5413.       IF wres~='CONNECT' THEN SIGNAL DONE2
  5414.       CALL DELAY(114)
  5415.       SAY ' 'CR
  5416.       CALL DELAY(28)
  5417.       SAY ' 'CR
  5418.       dcd
  5419.       IF RC=0 THEN
  5420.         DO
  5421.           CALL DELAY(128)
  5422.           dcd
  5423.           IF RC=0 THEN
  5424.             DO
  5425.               CALL DELAY(128)
  5426.               dcd
  5427.               IF RC=0 THEN SIGNAL DONE2
  5428.             END
  5429.         END
  5430.       CALL SETCLIP('BBS_interpret')
  5431.       CALL SETCLIP('BBS_MESSAGE')
  5432.       IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  5433.       ELSE IF bbsprefs.27=2 THEN Screen ON
  5434.       ELSE CALL DELAY(114)
  5435.       SAY ''CR    /* reset text defaults */
  5436.       SIGNAL LOGON
  5437.     END
  5438.   ELSE CALL checkstats()
  5439.   IF GETCLIP('BBS_resave')~='' THEN SIGNAL DONE2
  5440. END
  5441. EXIT
  5442.  
  5443.  
  5444. dimBBcols:
  5445. DO i=0 TO 7
  5446.   Send '\S'i'-'WORD('000 BA3 039 878 094 828 552 835',i+1)
  5447. END
  5448. RETURN
  5449.  
  5450.  
  5451. setBBcols:
  5452. DO i=0 TO 7
  5453.   Send '\S'i'-'WORD(bbsprefs.27,i+1)
  5454. END
  5455. RETURN
  5456.  
  5457.  
  5458. ATZreset:
  5459. TimeOut 10
  5460. Send 'ATZ\r'
  5461. Wait 'OK,RING'
  5462. IF RESULT~='OK' THEN
  5463.   DO
  5464.     Send '\d\wATZ\r'
  5465.     Wait 'OK'
  5466.     IF RESULT~='OK' THEN
  5467.       DO
  5468.         Send '\w\w+++\w\w\w\wATH\r'
  5469.         CALL sound('ATZ_FAIL')
  5470.         IF WORDS(bbsprefs.27)=8 THEN CALL setBBcols()
  5471.         ELSE IF bbsprefs.27=1 THEN CALL ScreenToFront('BAUD')
  5472.         ELSE IF bbsprefs.27=2 THEN Screen ON
  5473.         line='*** ATZ failed to reset!' TIME('C') DATE()
  5474.         SAY line'  Check your modem!!'CR
  5475.         CALL send2log(line)
  5476.         RETURN 1
  5477.       END
  5478.   END
  5479. TimeOut 45
  5480. Send '\dATH\r'
  5481. RETURN 0
  5482.  
  5483.  
  5484. getbaudrate: PROCEDURE
  5485. TRACE OFF
  5486. BaudRate
  5487. brate=RC
  5488. TRACE
  5489. RETURN brate
  5490.  
  5491.  
  5492. checkalias:
  5493. addressee=''
  5494. IF alias.0=0 THEN RETURN 0
  5495. DO i=1 TO alias.0
  5496.  IF UPPER(alias.i)=UPPER(string) THEN
  5497.   DO
  5498.    addressee=realname.i
  5499.    LEAVE i
  5500.   END
  5501. END
  5502. IF addressee='' THEN RETURN 0
  5503. string=''
  5504. SAY pen3'Email to 'def||addressee||CR
  5505. CALL editor(name maxtime-TRUNC(TIME('E')) 'MAIL' addressee . 0 0)
  5506. RETURN 0
  5507.  
  5508.  
  5509. CBV:
  5510. IF bbsprefs.22=0 THEN RETURN
  5511. SAY CR
  5512. CALL showtext(bbspath'BBS_TEXT/CBV_INFO' 1)
  5513. SAY CR
  5514. IF bbsprefs.13~=1 THEN bbsprefs.13=0
  5515. CBVflag=bbsCallBack.baud(name colorflag bbsprefs.13 data.5)
  5516. x=GETCLIP('CALLBACK')
  5517. CALL SETCLIP('CALLBACK')
  5518. data.27=STRIP(data.27 x)
  5519. IF CBVflag~=0 THEN SIGNAL OUT
  5520. RETURN
  5521.  
  5522. /* BBBBS.baud */
  5523.